@matheuspuel/state-machine 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/StateMachine.js +4 -0
  2. package/dist/StateMachine.js.map +1 -0
  3. package/dist/definition.js +12 -0
  4. package/dist/definition.js.map +1 -0
  5. package/dist/dts/StateMachine.d.ts +6 -0
  6. package/dist/dts/StateMachine.d.ts.map +1 -0
  7. package/dist/dts/definition.d.ts +28 -0
  8. package/dist/dts/definition.d.ts.map +1 -0
  9. package/dist/dts/form/definition.d.ts +20 -0
  10. package/dist/dts/form/definition.d.ts.map +1 -0
  11. package/dist/dts/form/index.d.ts +2 -0
  12. package/dist/dts/form/index.d.ts.map +1 -0
  13. package/dist/dts/index.d.ts +2 -0
  14. package/dist/dts/index.d.ts.map +1 -0
  15. package/dist/dts/machines/Form.d.ts +28 -0
  16. package/dist/dts/machines/Form.d.ts.map +1 -0
  17. package/dist/dts/machines/FormValue.d.ts +12 -0
  18. package/dist/dts/machines/FormValue.d.ts.map +1 -0
  19. package/dist/dts/machines/Struct.d.ts +3 -0
  20. package/dist/dts/machines/Struct.d.ts.map +1 -0
  21. package/dist/dts/machines/index.d.ts +5 -0
  22. package/dist/dts/machines/index.d.ts.map +1 -0
  23. package/dist/dts/machines/of.d.ts +6 -0
  24. package/dist/dts/machines/of.d.ts.map +1 -0
  25. package/dist/dts/react/context.d.ts +10 -0
  26. package/dist/dts/react/context.d.ts.map +1 -0
  27. package/dist/dts/react/index.d.ts +4 -0
  28. package/dist/dts/react/index.d.ts.map +1 -0
  29. package/dist/dts/react/useSelector.d.ts +5 -0
  30. package/dist/dts/react/useSelector.d.ts.map +1 -0
  31. package/dist/dts/react/useStateMachine.d.ts +6 -0
  32. package/dist/dts/react/useStateMachine.d.ts.map +1 -0
  33. package/dist/dts/runtime/index.d.ts +14 -0
  34. package/dist/dts/runtime/index.d.ts.map +1 -0
  35. package/dist/form/definition.js +14 -0
  36. package/dist/form/definition.js.map +1 -0
  37. package/dist/form/index.js +2 -0
  38. package/dist/form/index.js.map +1 -0
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/machines/Form.js +47 -0
  42. package/dist/machines/Form.js.map +1 -0
  43. package/dist/machines/FormValue.js +12 -0
  44. package/dist/machines/FormValue.js.map +1 -0
  45. package/dist/machines/Struct.js +15 -0
  46. package/dist/machines/Struct.js.map +1 -0
  47. package/dist/machines/index.js +5 -0
  48. package/dist/machines/index.js.map +1 -0
  49. package/dist/machines/of.js +10 -0
  50. package/dist/machines/of.js.map +1 -0
  51. package/dist/react/context.js +19 -0
  52. package/dist/react/context.js.map +1 -0
  53. package/dist/react/index.js +4 -0
  54. package/dist/react/index.js.map +1 -0
  55. package/dist/react/useSelector.js +9 -0
  56. package/dist/react/useSelector.js.map +1 -0
  57. package/dist/react/useStateMachine.js +25 -0
  58. package/dist/react/useStateMachine.js.map +1 -0
  59. package/dist/runtime/index.js +26 -0
  60. package/dist/runtime/index.js.map +1 -0
  61. package/package.json +33 -8
  62. package/src/StateMachine.ts +5 -3
  63. package/src/form/definition.ts +33 -0
  64. package/src/form/index.ts +1 -0
  65. package/src/index.ts +1 -1
  66. package/src/machines/Form.test.ts +67 -0
  67. package/src/machines/Form.ts +132 -0
  68. package/src/machines/FormValue.test.ts +3 -4
  69. package/src/machines/FormValue.ts +1 -1
  70. package/src/machines/Struct.test.ts +15 -14
  71. package/src/machines/Struct.ts +6 -20
  72. package/src/machines/index.ts +4 -3
  73. package/src/machines/of.test.ts +3 -4
  74. package/src/machines/of.ts +1 -1
  75. package/src/react/context.tsx +2 -2
  76. package/src/react/index.ts +3 -3
  77. package/src/react/useSelector.ts +1 -1
  78. package/src/react/useStateMachine.ts +1 -1
  79. package/src/runtime/index.ts +1 -1
  80. package/.eslintrc.js +0 -34
  81. package/.eslintrc.production.js +0 -11
  82. package/.prettierrc +0 -9
  83. package/pnpm-workspace.yaml +0 -2
  84. package/tsconfig.json +0 -14
  85. package/vitest.config.ts +0 -5
@@ -0,0 +1,4 @@
1
+ export { make } from './definition.js';
2
+ export * from './machines/index.js';
3
+ export { run } from './runtime/index.js';
4
+ //# sourceMappingURL=StateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { Optic } from '@matheuspuel/optic';
2
+ export const makeStore = (base) => ({
3
+ ...base,
4
+ zoom: zoomF => ({
5
+ get: () => zoomF(Optic.id()).get(base.get()),
6
+ getOption: () => zoomF(Optic.id()).getOption(base.get()),
7
+ update: f => base.update(zoomF(Optic.id()).update(f)),
8
+ }),
9
+ });
10
+ export const make = () => (args) => args;
11
+ export const prepareActions = (machine, store) => machine.actions({ Store: store });
12
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAa1C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAQ,IAAsB,EAAgB,EAAE,CAAC,CAAC;IACzE,GAAG,IAAI;IACP,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,CAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC7D,CAAC;CACH,CAAC,CAAA;AAkBF,MAAM,CAAC,MAAM,IAAI,GACf,GAAU,EAAE,CACZ,CAAkC,IAAkC,EAAE,EAAE,CACtE,IAAI,CAAA;AAIR,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAqC,EACrC,KAAmB,EACY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { make } from './definition.js';
2
+ export type { StateMachine } from './definition.js';
3
+ export * from './machines/index.js';
4
+ export { run } from './runtime/index.js';
5
+ export type { Instance } from './runtime/index.js';
6
+ //# sourceMappingURL=StateMachine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { Optic } from '@matheuspuel/optic';
2
+ export type StoreBase<State> = {
3
+ get: () => State;
4
+ update: (stateUpdate: (_: State) => State) => void;
5
+ };
6
+ export type Store<State> = StoreBase<State> & {
7
+ zoom: <A, Optional extends boolean>(f: (optic: Optic<State, State>) => Optic<A, State, Optional>) => StoreBase<A>;
8
+ };
9
+ export declare const makeStore: <State>(base: StoreBase<State>) => Store<State>;
10
+ export type StateAction<A extends unknown[], B> = (...args: A) => B;
11
+ export type AnyStateAction = StateAction<any[], unknown>;
12
+ export type AnyStateActions = {
13
+ [key: string]: AnyStateAction | AnyStateActions;
14
+ };
15
+ export type StateMachine<State, Actions extends AnyStateActions> = {
16
+ initialState: State;
17
+ actions: (machine: {
18
+ Store: Store<State>;
19
+ }) => Actions;
20
+ start?: (machine: {
21
+ Store: Store<State>;
22
+ }) => undefined | Promise<unknown>;
23
+ onUpdate?: (state: State) => void | Promise<void>;
24
+ };
25
+ export declare const make: <State>() => <Actions extends AnyStateActions>(args: StateMachine<State, Actions>) => StateMachine<State, Actions>;
26
+ export type PreparedStateActions<Actions extends AnyStateActions> = Actions;
27
+ export declare const prepareActions: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>, store: Store<State>) => PreparedStateActions<Actions>;
28
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,KAAK,IAAI;IAC7B,GAAG,EAAE,MAAM,KAAK,CAAA;IAChB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG;IAC5C,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAS,OAAO,EAChC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KACzD,SAAS,CAAC,CAAC,CAAC,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,KAAK,CAOnE,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;AAGnE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,SAAS,eAAe,IAAI;IACjE,YAAY,EAAE,KAAK,CAAA;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,OAAO,CAAA;IACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,IAAI,GACd,KAAK,QACL,OAAO,SAAS,eAAe,EAAE,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,iCAC9D,CAAA;AAER,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,IAAI,OAAO,CAAA;AAE3E,eAAO,MAAM,cAAc,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACnE,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EACrC,OAAO,KAAK,CAAC,KAAK,CAAC,KAClB,oBAAoB,CAAC,OAAO,CAAsC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import { ParseError } from 'effect/ParseResult';
3
+ export type AnyForm = {
4
+ [key: string]: AnyForm | FormField<any, any, any>;
5
+ };
6
+ export type FormField<A, I, E> = {
7
+ initial: I;
8
+ validate: (value: I) => Effect.Effect<A, E>;
9
+ fromData: (data: A) => I;
10
+ };
11
+ export declare const field: <A, I, E>(args: FormField<A, I, E>) => FormField<A, I, E>;
12
+ export declare const fieldSchema: <A, I>(args: {
13
+ initial: I;
14
+ schema: Schema.Schema<A, I>;
15
+ }) => FormField<A, I, ParseError>;
16
+ export declare const fieldSuccess: <A>(args: {
17
+ initial: A;
18
+ }) => FormField<A, A, never>;
19
+ export declare const Struct: <Fields extends AnyForm>(fields: Fields) => Fields;
20
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../src/form/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI;IAC/B,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,uBAAS,CAAA;AAEhE,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM;IACtC,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC5B,gCAKG,CAAA;AAEJ,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,MAAM;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,2BAKhD,CAAA;AAEJ,eAAO,MAAM,MAAM,GAAI,MAAM,SAAS,OAAO,EAAE,QAAQ,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as Form from './definition.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as StateMachine from './StateMachine.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { Effect, Option } from 'effect';
2
+ import { AnyForm, FormField } from '../form/definition.js';
3
+ export type FormState<Form extends AnyForm> = {
4
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
5
+ value: I;
6
+ error: E | null;
7
+ } : Form[K] extends AnyForm ? FormState<Form[K]> : never;
8
+ };
9
+ export type FormData<Form extends AnyForm> = {
10
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? A : Form[K] extends AnyForm ? FormData<Form[K]> : never;
11
+ };
12
+ export type FormError<Form extends AnyForm> = {
13
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? Option.Option<E> : Form[K] extends AnyForm ? FormError<Form[K]> : never;
14
+ };
15
+ export type FormActions<Form extends AnyForm> = {
16
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
17
+ set: (value: I) => void;
18
+ update: (f: (previous: I) => I) => void;
19
+ error: {
20
+ set: (error: E | null) => void;
21
+ };
22
+ } : Form[K] extends AnyForm ? FormActions<Form[K]> : never;
23
+ };
24
+ export declare const Form: <F extends AnyForm>(form: F) => import("../definition.js").StateMachine<FormState<F>, FormActions<F> & {
25
+ validate: () => Effect.Effect<FormData<F>, FormError<F>>;
26
+ setStateFromData: (data: FormData<F>) => void;
27
+ }>;
28
+ //# sourceMappingURL=Form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../src/machines/Form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,GAC7B,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,OAAO,IAAI;KAC1C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,CAAC,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACjB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAChB,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,OAAO,IAAI;KAC7C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QACE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;QACvB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;QACvC,KAAK,EAAE;YAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;SAAE,CAAA;KAC1C,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACpB,KAAK;CACZ,CAAA;AAMD,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,OAAO,EAAE,MAAM,CAAC;cAgE/B,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;sBACtC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;EAsBlD,CAAA"}
@@ -0,0 +1,12 @@
1
+ export type FormValue<A, E> = {
2
+ value: A;
3
+ error: E | null;
4
+ };
5
+ export declare const FormValue: <A, E>(initialValue: A) => import("../definition.js").StateMachine<FormValue<A, E>, {
6
+ update: (f: (previous: A) => A) => void;
7
+ set: (value: A) => void;
8
+ error: {
9
+ set: (error: E | null) => void;
10
+ };
11
+ }>;
12
+ //# sourceMappingURL=FormValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormValue.d.ts","sourceRoot":"","sources":["../../../src/machines/FormValue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAA;AAE3D,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;gBAI7B,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;iBAEjB,CAAC;;qBAEC,CAAC,GAAG,IAAI;;EAIzB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { AnyStateActions, StateMachine } from '../definition.js';
2
+ export declare const Struct: <A extends Record<string, StateMachine<any, AnyStateActions>>>(fields: A) => StateMachine<{ [K in keyof A]: A[K] extends StateMachine<infer State, any> ? State : never; }, { [K_1 in keyof A]: A[K_1] extends StateMachine<any, infer Actions extends AnyStateActions> ? Actions : never; }>;
3
+ //# sourceMappingURL=Struct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Struct.d.ts","sourceRoot":"","sources":["../../../src/machines/Struct.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAGf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,MAAM,GACjB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAE5D,QAAQ,CAAC,qBAGN,CAAC,8CAA8C,KAAK,sFAEA,OAAO,+CAgB5D,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { Form } from './Form.js';
2
+ export { FormValue } from './FormValue.js';
3
+ export { of } from './of.js';
4
+ export { Struct } from './Struct.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/machines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const of: <A>(initialState: A) => import("../definition.js").StateMachine<A, {
2
+ get: () => A;
3
+ update: (f: (previous: A) => A) => void;
4
+ set: (value: A) => void;
5
+ }>;
6
+ //# sourceMappingURL=of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"of.d.ts","sourceRoot":"","sources":["../../../src/machines/of.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,cAAc,CAAC;;gBAKnB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;iBACjB,CAAC;EAEhB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { AnyStateActions, StateMachine } from '../definition.js';
3
+ export declare const makeStateMachineContext: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>) => {
4
+ Provider: (props: {
5
+ children: React.ReactNode;
6
+ }) => import("react/jsx-runtime").JSX.Element;
7
+ useActions: () => Actions;
8
+ useSelector: <A>(fn: (state: State) => A) => A;
9
+ };
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,eAAe,EAEf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAGzB,eAAO,MAAM,uBAAuB,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EAC5E,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;sBAQjB;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;kBAKjC,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC;CAM5C,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './context.js';
2
+ export * from './useSelector.js';
3
+ export * from './useStateMachine.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Equivalence } from 'effect';
2
+ import { AnyStateActions } from '../definition.js';
3
+ import { Instance } from '../runtime/index.js';
4
+ export declare const makeUseSelector: <State, Actions extends AnyStateActions>(stateMachine: Instance<State, Actions>) => <A>(selector: (state: State) => A, equivalence?: Equivalence.Equivalence<A>) => A;
5
+ //# sourceMappingURL=useSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelector.d.ts","sourceRoot":"","sources":["../../../src/react/useSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,eAAO,MAAM,eAAe,GACzB,KAAK,EAAE,OAAO,SAAS,eAAe,EACrC,cAAc,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAEvC,CAAC,EACA,UAAU,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,EAC7B,cAAc,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KACvC,CAYA,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { AnyStateActions, StateMachine } from '../definition.js';
2
+ export declare const useStateMachine: <State, Actions extends AnyStateActions>(stateMachine: StateMachine<State, Actions> | (() => StateMachine<State, Actions>)) => {
3
+ state: State;
4
+ actions: Actions;
5
+ };
6
+ //# sourceMappingURL=useStateMachine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateMachine.d.ts","sourceRoot":"","sources":["../../../src/react/useStateMachine.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAGf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,eAAe,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACpE,cACI,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,GAC5B,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;;CA8BzC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Effect, Ref } from 'effect';
2
+ import { AnyStateActions, PreparedStateActions, StateMachine } from '../definition.js';
3
+ type SubscriptionTask<State> = (state: State) => Effect.Effect<void>;
4
+ export type Instance<State, Actions extends AnyStateActions> = {
5
+ ref: Ref.Ref<State>;
6
+ actions: PreparedStateActions<Actions>;
7
+ startPromise: Promise<unknown> | undefined;
8
+ subscribe: (task: SubscriptionTask<State>) => Effect.Effect<{
9
+ unsubscribe: Effect.Effect<void, never, never>;
10
+ }, never, never>;
11
+ };
12
+ export declare const run: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>) => Instance<State, Actions>;
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EACL,eAAe,EAGf,oBAAoB,EACpB,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,KAAK,gBAAgB,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAEpE,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,SAAS,eAAe,IAAI;IAC7D,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACtC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;IAC1C,SAAS,EAAE,CACT,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAC1B,MAAM,CAAC,MAAM,CAChB;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;KAAE,EAClD,KAAK,EACL,KAAK,CACN,CAAA;CACF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACxD,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CA6BzB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Effect, Schema } from 'effect';
2
+ export const field = (args) => args;
3
+ export const fieldSchema = (args) => field({
4
+ initial: args.initial,
5
+ validate: Schema.decode(args.schema),
6
+ fromData: Schema.encodeSync(args.schema),
7
+ });
8
+ export const fieldSuccess = (args) => field({
9
+ initial: args.initial,
10
+ validate: Effect.succeed,
11
+ fromData: _ => _,
12
+ });
13
+ export const Struct = (fields) => fields;
14
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/form/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAavC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAU,IAAwB,EAAE,EAAE,CAAC,IAAI,CAAA;AAEhE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,IAGjC,EAAE,EAAE,CACH,KAAK,CAAmB;IACtB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;CACzC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAI,IAAoB,EAAE,EAAE,CACtD,KAAK,CAAc;IACjB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,QAAQ,EAAE,MAAM,CAAC,OAAO;IACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACjB,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,MAAM,GAAG,CAAyB,MAAc,EAAE,EAAE,CAAC,MAAM,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as Form from './definition.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * as StateMachine from './StateMachine.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { Effect, Either, Option, Record } from 'effect';
2
+ import { make, makeStore } from '../definition.js';
3
+ const isField = (value) => typeof value.validate === 'function';
4
+ export const Form = (form) => {
5
+ const getInitialState = (form) => Record.map(form, _ => isField(_) ? { value: _.initial, error: null } : getInitialState(_));
6
+ const getActions = (form, Store) => Record.map(form, (_, key) => isField(_)
7
+ ? {
8
+ update: (f) => Store.update(_ => ({
9
+ ..._,
10
+ [key]: { value: f(_[key].value), error: null },
11
+ })),
12
+ set: (value) => Store.update(_ => ({ ..._, [key]: { value, error: null } })),
13
+ error: {
14
+ set: (error) => Store.update(_ => ({ ..._, [key]: { value: _.value, error } })),
15
+ },
16
+ }
17
+ : getActions(_, makeStore({
18
+ get: () => Store.get()[key],
19
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
20
+ })));
21
+ const validate = (form, Store) => Effect.all(Record.map(form, (_, key) => isField(_)
22
+ ? _.validate(Store.get()[key].value).pipe(Effect.either, Effect.tap(e => Store.update(_ => ({
23
+ ..._,
24
+ [key]: {
25
+ value: _[key].value,
26
+ error: Option.getOrNull(Either.getLeft(e)),
27
+ },
28
+ }))), Effect.flatten)
29
+ : validate(_, makeStore({
30
+ get: () => Store.get()[key],
31
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
32
+ }))), { mode: 'validate' });
33
+ return make()({
34
+ initialState: getInitialState(form),
35
+ actions: ({ Store }) => ({
36
+ ...getActions(form, Store),
37
+ validate: () => validate(form, Store),
38
+ setStateFromData: (data) => Store.update(() => {
39
+ const updateState = (form, data) => Record.map(form, (_, key) => isField(_)
40
+ ? { value: _.fromData(data[key]), error: null }
41
+ : updateState(_, data[key]));
42
+ return updateState(form, data);
43
+ }),
44
+ }),
45
+ });
46
+ };
47
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/machines/Form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { make } from '../definition.js';
2
+ export const FormValue = (initialValue) => make()({
3
+ initialState: { value: initialValue, error: null },
4
+ actions: ({ Store }) => ({
5
+ update: (f) => Store.update(_ => ({ value: f(_.value), error: null })),
6
+ set: (value) => Store.update(() => ({ value, error: null })),
7
+ error: {
8
+ set: (error) => Store.update(_ => ({ value: _.value, error })),
9
+ },
10
+ }),
11
+ });
12
+ //# sourceMappingURL=FormValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormValue.js","sourceRoot":"","sources":["../../src/machines/FormValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAIvC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAO,YAAe,EAAE,EAAE,CACjD,IAAI,EAAmB,CAAC;IACtB,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE;IAClD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,CAAqB,EAAE,EAAE,CAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,GAAG,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,KAAe,EAAE,EAAE,CACvB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACjD;KACF,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { Record } from 'effect';
2
+ import { make, makeStore, } from '../definition.js';
3
+ export const Struct = (fields) => make()({
4
+ initialState: Record.map(fields, _ => _.initialState),
5
+ actions: ({ Store }) => ({
6
+ ...Record.map(fields, (_, key) => _.actions({
7
+ Store: makeStore({
8
+ get: () => Store.get()[key],
9
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
10
+ }),
11
+ })),
12
+ }),
13
+ // TODO implement other options
14
+ });
15
+ //# sourceMappingURL=Struct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Struct.js","sourceRoot":"","sources":["../../src/machines/Struct.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAEL,IAAI,EACJ,SAAS,GAEV,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,MAAM,MAAM,GAAG,CAGpB,MAAS,EACT,EAAE,CACF,IAAI,EAEA,CAID;IACD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAQ;IAC5D,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,GAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAChC,CAAC,CAAC,OAAO,CAAC;YACR,KAAK,EAAE,SAAS,CAAC;gBACf,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7D,CAAQ;SACV,CAAC,CACK;KACV,CAAC;IACF,+BAA+B;CAChC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { Form } from './Form.js';
2
+ export { FormValue } from './FormValue.js';
3
+ export { of } from './of.js';
4
+ export { Struct } from './Struct.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/machines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { make } from '../definition.js';
2
+ export const of = (initialState) => make()({
3
+ initialState,
4
+ actions: ({ Store }) => ({
5
+ get: Store.get,
6
+ update: (f) => Store.update(f),
7
+ set: (value) => Store.update(() => value),
8
+ }),
9
+ });
10
+ //# sourceMappingURL=of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"of.js","sourceRoot":"","sources":["../../src/machines/of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAI,YAAe,EAAE,EAAE,CACvC,IAAI,EAAK,CAAC;IACR,YAAY;IACZ,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,CAAC,CAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,GAAG,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KAC7C,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { useStateMachine } from './useStateMachine.js';
4
+ export const makeStateMachineContext = (machine) => {
5
+ const Context = React.createContext(undefined);
6
+ return {
7
+ Provider: (props) => {
8
+ const value = useStateMachine(machine);
9
+ return _jsx(Context.Provider, { value: value, children: props.children });
10
+ },
11
+ useActions: () => React.useContext(Context).actions,
12
+ useSelector: (fn) => {
13
+ const state = React.useContext(Context).state;
14
+ // eslint-disable-next-line react-hooks/exhaustive-deps
15
+ return React.useMemo(() => fn(state), [state]);
16
+ },
17
+ };
18
+ };
19
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/react/context.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAqC,EACrC,EAAE;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAIhC,SAAgB,CAAC,CAAA;IACpB,OAAO;QACL,QAAQ,EAAE,CAAC,KAAoC,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;YACtC,OAAO,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,KAAK,CAAC,QAAQ,GAAoB,CAAA;QAC5E,CAAC;QACD,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO;QACnD,WAAW,EAAE,CAAK,EAAuB,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAA;YAC7C,uDAAuD;YACvD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './context.js';
2
+ export * from './useSelector.js';
3
+ export * from './useStateMachine.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { Effect, Equal } from 'effect';
2
+ import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector';
3
+ export const makeUseSelector = (stateMachine) => (selector, equivalence) => useSyncExternalStoreWithSelector(onChange => {
4
+ const subscription = stateMachine
5
+ .subscribe(() => Effect.sync(onChange))
6
+ .pipe(Effect.runSync);
7
+ return () => subscription.unsubscribe.pipe(Effect.runSync);
8
+ }, () => stateMachine.ref.get.pipe(Effect.runSync), undefined, selector, equivalence ?? Equal.equivalence());
9
+ //# sourceMappingURL=useSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelector.js","sourceRoot":"","sources":["../../src/react/useSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAIxF,MAAM,CAAC,MAAM,eAAe,GAC1B,CACE,YAAsC,EACtC,EAAE,CACJ,CACE,QAA6B,EAC7B,WAAwC,EACrC,EAAE,CACL,gCAAgC,CAC9B,QAAQ,CAAC,EAAE;IACT,MAAM,YAAY,GAAG,YAAY;SAC9B,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC5D,CAAC,EACD,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAC/C,SAAS,EACT,QAAQ,EACR,WAAW,IAAI,KAAK,CAAC,WAAW,EAAK,CACtC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { makeStore, prepareActions, } from '../definition.js';
3
+ export const useStateMachine = (stateMachine) => {
4
+ const machine = typeof stateMachine === 'function' ? stateMachine() : stateMachine;
5
+ const [state, setState] = React.useState(() => machine.initialState);
6
+ const stateRef = React.useRef(machine.initialState);
7
+ const getState = React.useMemo(() => () => stateRef.current, []);
8
+ const store = React.useMemo(() => makeStore({
9
+ get: getState,
10
+ update: fn => {
11
+ const previousState = getState();
12
+ const state = fn(previousState);
13
+ stateRef.current = state;
14
+ void machine.onUpdate?.(state);
15
+ setState(() => state);
16
+ },
17
+ }), [machine, getState]);
18
+ const actions = React.useMemo(() => prepareActions(machine, store), [machine, store]);
19
+ React.useEffect(() => {
20
+ void machine.start?.({ Store: store });
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ }, []);
23
+ return { state, actions };
24
+ };
25
+ //# sourceMappingURL=useStateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateMachine.js","sourceRoot":"","sources":["../../src/react/useStateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAEL,SAAS,EACT,cAAc,GAEf,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,YAEwC,EACxC,EAAE;IACF,MAAM,OAAO,GACX,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAA;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CACH,SAAS,CAAQ;QACf,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,EAAE,CAAC,EAAE;YACX,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAA;YAChC,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,CAAA;YAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;YACxB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;YAC9B,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;KACF,CAAC,EACJ,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAA;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAC3B,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EACpC,CAAC,OAAO,EAAE,KAAK,CAAC,CACjB,CAAA;IACD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACtC,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { Array, Effect, Ref } from 'effect';
2
+ import { makeStore, prepareActions, } from '../definition.js';
3
+ export const run = (machine) => {
4
+ const subscriptionsRef = Ref.unsafeMake([]);
5
+ const ref = Ref.unsafeMake(machine.initialState);
6
+ const store = makeStore({
7
+ get: () => ref.get.pipe(Effect.runSync),
8
+ update: fn => Effect.gen(function* () {
9
+ const previousState = yield* ref.get;
10
+ const state = fn(previousState);
11
+ yield* Ref.set(ref, state);
12
+ yield* Effect.forEach(yield* subscriptionsRef.get, _ => _(state)).pipe(Effect.exit);
13
+ void machine.onUpdate?.(state);
14
+ }).pipe(Effect.runSync),
15
+ });
16
+ const actions = prepareActions(machine, store);
17
+ const subscribe = (task) => Effect.gen(function* () {
18
+ yield* Ref.update(subscriptionsRef, Array.append(task));
19
+ return {
20
+ unsubscribe: Ref.update(subscriptionsRef, Array.filter(_ => _ !== task)),
21
+ };
22
+ });
23
+ const startPromise = machine.start?.({ Store: store });
24
+ return { ref, actions, subscribe, startPromise };
25
+ };
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAEL,SAAS,EACT,cAAc,GAGf,MAAM,kBAAkB,CAAA;AAiBzB,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,OAAqC,EACX,EAAE;IAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAA4B,EAAE,CAAC,CAAA;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,SAAS,CAAQ;QAC7B,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,MAAM,EAAE,EAAE,CAAC,EAAE,CACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;YACpC,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,CAAA;YAC/B,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC1B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACpE,MAAM,CAAC,IAAI,CACZ,CAAA;YACD,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1B,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,CAAC,IAA6B,EAAE,EAAE,CAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QACvD,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,MAAM,CACrB,gBAAgB,EAChB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAC9B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACJ,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACtD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AAClD,CAAC,CAAA"}