Skip to content

Instantly share code, notes, and snippets.

@fakenickels
Last active October 24, 2018 01:37
Show Gist options
  • Save fakenickels/3c0e8b0b27bdccf10ba916a38fb8d3fe to your computer and use it in GitHub Desktop.
Save fakenickels/3c0e8b0b27bdccf10ba916a38fb8d3fe to your computer and use it in GitHub Desktop.
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, "[email protected]");
Js.log(LoginForm.state^);
LoginForm.handleChange(RememberMe, true);
Js.log(LoginForm.state^);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment