Last active
October 24, 2018 01:37
-
-
Save fakenickels/3c0e8b0b27bdccf10ba916a38fb8d3fe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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