Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module type Config = {
- type field('a);
- type state;
- let initialState: state;
- let set: (state, field('a), 'a) => state;
- };
- module Make = (Config: Config) => {
- let state = ref(Config.initialState);
- module Validation = {
- type t('a) =
- | Email(Config.field(string))
- | Required(Config.field('a))
- | Min(Config.field(int));
- };
- let handleChange: type value. (Config.field(value), value) => unit =
- (field, value) => {
- state := Config.set(state^, field, value);
- ();
- };
- };
- module FormConfig = {
- type field(_) =
- | Email: field(string)
- | Password: field(string)
- | RememberMe: field(bool);
- type state = {
- email: string,
- password: string,
- rememberMe: bool,
- };
- let initialState = {email: "", password: "", rememberMe: false};
- let get: type value. (state, field(value)) => value =
- (state, field) =>
- switch (field) {
- | Email => state.email
- | Password => state.password
- | RememberMe => state.rememberMe
- };
- let set: type value. (state, field(value), value) => state =
- (state, field, value) =>
- switch (field) {
- | Email => {...state, email: value}
- | Password => {...state, password: value}
- | RememberMe => {...state, rememberMe: value}
- };
- };
- module LoginForm = Make(FormConfig);
- let schema = [
- LoginForm.Validation.Email(FormConfig.Email),
- LoginForm.Validation.Email(FormConfig.Password),
- LoginForm.Validation.Required(RememberMe),
- ];
- LoginForm.handleChange(Email, "grsabreu@gmail.com");
- Js.log(LoginForm.state^);
- LoginForm.handleChange(RememberMe, true);
- Js.log(LoginForm.state^);
Add Comment
Please, Sign In to add comment