Guest User

Untitled

a guest
Oct 23rd, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. module type Config = {
  2. type field('a);
  3. type state;
  4. let initialState: state;
  5. let set: (state, field('a), 'a) => state;
  6. };
  7.  
  8. module Make = (Config: Config) => {
  9. let state = ref(Config.initialState);
  10.  
  11. module Validation = {
  12. type t('a) =
  13. | Email(Config.field(string))
  14. | Required(Config.field('a))
  15. | Min(Config.field(int));
  16. };
  17.  
  18. let handleChange: type value. (Config.field(value), value) => unit =
  19. (field, value) => {
  20. state := Config.set(state^, field, value);
  21. ();
  22. };
  23. };
  24.  
  25. module FormConfig = {
  26. type field(_) =
  27. | Email: field(string)
  28. | Password: field(string)
  29. | RememberMe: field(bool);
  30.  
  31. type state = {
  32. email: string,
  33. password: string,
  34. rememberMe: bool,
  35. };
  36.  
  37. let initialState = {email: "", password: "", rememberMe: false};
  38.  
  39. let get: type value. (state, field(value)) => value =
  40. (state, field) =>
  41. switch (field) {
  42. | Email => state.email
  43. | Password => state.password
  44. | RememberMe => state.rememberMe
  45. };
  46.  
  47. let set: type value. (state, field(value), value) => state =
  48. (state, field, value) =>
  49. switch (field) {
  50. | Email => {...state, email: value}
  51. | Password => {...state, password: value}
  52. | RememberMe => {...state, rememberMe: value}
  53. };
  54. };
  55.  
  56. module LoginForm = Make(FormConfig);
  57. let schema = [
  58. LoginForm.Validation.Email(FormConfig.Email),
  59. LoginForm.Validation.Email(FormConfig.Password),
  60. LoginForm.Validation.Required(RememberMe),
  61. ];
  62. LoginForm.handleChange(Email, "grsabreu@gmail.com");
  63. Js.log(LoginForm.state^);
  64. LoginForm.handleChange(RememberMe, true);
  65. Js.log(LoginForm.state^);
Add Comment
Please, Sign In to add comment