foldkit 0.148.2 → 0.149.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 (80) hide show
  1. package/README.md +15 -24
  2. package/dist/message/index.d.ts +2 -1
  3. package/dist/message/index.d.ts.map +1 -1
  4. package/dist/message/index.js +1 -1
  5. package/dist/message/public.d.ts +2 -1
  6. package/dist/message/public.d.ts.map +1 -1
  7. package/dist/message/public.js +1 -1
  8. package/dist/runtime/runtime.d.ts +1 -2
  9. package/dist/runtime/runtime.d.ts.map +1 -1
  10. package/dist/schema/index.d.ts +53 -8
  11. package/dist/schema/index.d.ts.map +1 -1
  12. package/dist/schema/index.js +179 -21
  13. package/dist/subscription/subscription.d.ts +1 -1
  14. package/dist/subscription/subscription.js +1 -1
  15. package/dist/test/apps/attributes.d.ts +7 -4
  16. package/dist/test/apps/attributes.d.ts.map +1 -1
  17. package/dist/test/apps/attributes.js +6 -6
  18. package/dist/test/apps/bubbling.d.ts +8 -2
  19. package/dist/test/apps/bubbling.d.ts.map +1 -1
  20. package/dist/test/apps/bubbling.js +10 -9
  21. package/dist/test/apps/colorPicker.d.ts +7 -6
  22. package/dist/test/apps/colorPicker.d.ts.map +1 -1
  23. package/dist/test/apps/colorPicker.js +8 -7
  24. package/dist/test/apps/contextMenu.d.ts +14 -4
  25. package/dist/test/apps/contextMenu.d.ts.map +1 -1
  26. package/dist/test/apps/contextMenu.js +8 -9
  27. package/dist/test/apps/counter.d.ts +52 -24
  28. package/dist/test/apps/counter.d.ts.map +1 -1
  29. package/dist/test/apps/counter.js +23 -34
  30. package/dist/test/apps/crashOnRender.d.ts +44 -28
  31. package/dist/test/apps/crashOnRender.d.ts.map +1 -1
  32. package/dist/test/apps/crashOnRender.js +17 -20
  33. package/dist/test/apps/drafts.d.ts +19 -8
  34. package/dist/test/apps/drafts.d.ts.map +1 -1
  35. package/dist/test/apps/drafts.js +10 -11
  36. package/dist/test/apps/feedSocket.d.ts +13 -13
  37. package/dist/test/apps/feedSocket.d.ts.map +1 -1
  38. package/dist/test/apps/feedSocket.js +17 -28
  39. package/dist/test/apps/fileUpload.d.ts +7 -6
  40. package/dist/test/apps/fileUpload.d.ts.map +1 -1
  41. package/dist/test/apps/fileUpload.js +9 -8
  42. package/dist/test/apps/formChild.d.ts +40 -24
  43. package/dist/test/apps/formChild.d.ts.map +1 -1
  44. package/dist/test/apps/formChild.js +31 -32
  45. package/dist/test/apps/interactions.d.ts +16 -11
  46. package/dist/test/apps/interactions.d.ts.map +1 -1
  47. package/dist/test/apps/interactions.js +21 -24
  48. package/dist/test/apps/keypress.d.ts +11 -11
  49. package/dist/test/apps/keypress.d.ts.map +1 -1
  50. package/dist/test/apps/keypress.js +12 -12
  51. package/dist/test/apps/login.d.ts +43 -23
  52. package/dist/test/apps/login.d.ts.map +1 -1
  53. package/dist/test/apps/login.js +17 -25
  54. package/dist/test/apps/logoutButton.d.ts +12 -6
  55. package/dist/test/apps/logoutButton.d.ts.map +1 -1
  56. package/dist/test/apps/logoutButton.js +15 -11
  57. package/dist/test/apps/mountPanel.d.ts +19 -20
  58. package/dist/test/apps/mountPanel.d.ts.map +1 -1
  59. package/dist/test/apps/mountPanel.js +22 -24
  60. package/dist/test/apps/multiRole.d.ts +6 -3
  61. package/dist/test/apps/multiRole.d.ts.map +1 -1
  62. package/dist/test/apps/multiRole.js +8 -7
  63. package/dist/test/apps/pointer.d.ts +13 -6
  64. package/dist/test/apps/pointer.d.ts.map +1 -1
  65. package/dist/test/apps/pointer.js +11 -10
  66. package/dist/test/apps/resumeUpload.d.ts +11 -14
  67. package/dist/test/apps/resumeUpload.d.ts.map +1 -1
  68. package/dist/test/apps/resumeUpload.js +17 -27
  69. package/dist/test/apps/scorePanel.d.ts +6 -3
  70. package/dist/test/apps/scorePanel.d.ts.map +1 -1
  71. package/dist/test/apps/scorePanel.js +8 -7
  72. package/dist/test/apps/selectiveKeys.d.ts +5 -1
  73. package/dist/test/apps/selectiveKeys.d.ts.map +1 -1
  74. package/dist/test/apps/selectiveKeys.js +13 -12
  75. package/dist/test/apps/uploads.d.ts +52 -30
  76. package/dist/test/apps/uploads.d.ts.map +1 -1
  77. package/dist/test/apps/uploads.js +20 -30
  78. package/dist/update/update.d.ts +4 -7
  79. package/dist/update/update.d.ts.map +1 -1
  80. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { Effect, Match as M, Schema as S } from 'effect';
1
+ import { Effect, Schema as S } from 'effect';
2
2
  import * as Command from '../../command/index.js';
3
- import { m } from '../../message/index.js';
3
+ import { defineMessageUnion } from '../../message/index.js';
4
4
  import { evo } from '../../struct/index.js';
5
5
  // MODEL
6
6
  export const SaveStatus = S.Literals(['Editing', 'Saving', 'Saved']);
@@ -9,33 +9,32 @@ export const Model = S.Struct({
9
9
  status: SaveStatus,
10
10
  });
11
11
  // MESSAGE
12
- export const ClickedSaveDraft = m('ClickedSaveDraft');
13
- export const SucceededSaveDraft = m('SucceededSaveDraft', {
14
- revision: S.Number,
12
+ export const Message = defineMessageUnion({
13
+ ClickedSaveDraft: {},
14
+ SucceededSaveDraft: { revision: S.Number },
15
15
  });
16
- export const Message = S.Union([ClickedSaveDraft, SucceededSaveDraft]);
17
16
  // COMMAND
18
17
  export const SaveDraftArgs = S.Struct({ revision: S.Number });
19
18
  export const SaveDraft = Command.define('SaveDraft', {
20
19
  args: SaveDraftArgs.fields,
21
- messages: [SucceededSaveDraft],
20
+ messages: [Message.SucceededSaveDraft],
22
21
  interrupt: true,
23
- execute: ({ revision }) => Effect.as(Effect.never, SucceededSaveDraft({ revision })),
22
+ execute: ({ revision }) => Effect.as(Effect.never, Message.SucceededSaveDraft({ revision })),
24
23
  });
25
24
  // INIT
26
25
  export const initialModel = { revision: 0, status: 'Editing' };
27
26
  // UPDATE
28
- export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
27
+ export const update = (model, message) => Message.match(message, {
29
28
  ClickedSaveDraft: () => [
30
29
  evo(model, { status: () => 'Saving' }),
31
30
  [SaveDraft({ revision: model.revision })],
32
31
  ],
33
32
  SucceededSaveDraft: () => [evo(model, { status: () => 'Saved' }), []],
34
- }));
33
+ });
35
34
  // VIEW
36
35
  export const view = (model, h) => {
37
36
  const body = h.div([], [
38
- h.button([h.OnClick(ClickedSaveDraft())], ['Save draft']),
37
+ h.button([h.OnClick(Message.ClickedSaveDraft())], ['Save draft']),
39
38
  h.span([], [`draft: ${model.status}`]),
40
39
  ]);
41
40
  return { title: 'Drafts', body };
@@ -6,19 +6,16 @@ export declare const Model: S.Struct<{
6
6
  readonly status: S.Literals<readonly ["Disconnected", "Connected", "Failed"]>;
7
7
  }>;
8
8
  export type Model = typeof Model.Type;
9
- export declare const ClickedToggleFeed: import("../../schema/index.js").CallableTaggedStruct<"ClickedToggleFeed", {}>;
10
- export declare const AcquiredFeedSocket: import("../../schema/index.js").CallableTaggedStruct<"AcquiredFeedSocket", {
11
- socketId: S.String;
9
+ export declare const Message: import("../../schema/index.js").MessageUnion<{
10
+ readonly ClickedToggleFeed: {};
11
+ readonly AcquiredFeedSocket: {
12
+ readonly socketId: S.String;
13
+ };
14
+ readonly ReleasedFeedSocket: {};
15
+ readonly FailedAcquireFeedSocket: {
16
+ readonly error: S.String;
17
+ };
12
18
  }>;
13
- export declare const ReleasedFeedSocket: import("../../schema/index.js").CallableTaggedStruct<"ReleasedFeedSocket", {}>;
14
- export declare const FailedAcquireFeedSocket: import("../../schema/index.js").CallableTaggedStruct<"FailedAcquireFeedSocket", {
15
- error: S.String;
16
- }>;
17
- export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedToggleFeed", {}>, import("../../schema/index.js").CallableTaggedStruct<"AcquiredFeedSocket", {
18
- socketId: S.String;
19
- }>, import("../../schema/index.js").CallableTaggedStruct<"ReleasedFeedSocket", {}>, import("../../schema/index.js").CallableTaggedStruct<"FailedAcquireFeedSocket", {
20
- error: S.String;
21
- }>]>;
22
19
  export type Message = typeof Message.Type;
23
20
  export type FeedSocket = Readonly<{
24
21
  socketId: string;
@@ -69,6 +66,9 @@ export declare const initialModel: {
69
66
  readonly isFeedOpen: boolean;
70
67
  readonly status: "Disconnected" | "Connected" | "Failed";
71
68
  };
72
- export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<never>];
69
+ export declare const update: (model: Model, message: Message) => readonly [{
70
+ readonly isFeedOpen: boolean;
71
+ readonly status: "Disconnected" | "Connected" | "Failed";
72
+ }, readonly never[]];
73
73
  export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
74
74
  //# sourceMappingURL=feedSocket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedSocket.d.ts","sourceRoot":"","sources":["../../../src/test/apps/feedSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEzE,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,eAAe,MAAM,gCAAgC,CAAA;AAMjE,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,iBAAiB,+EAAyB,CAAA;AACvD,eAAO,MAAM,kBAAkB;;EAE7B,CAAA;AACF,eAAO,MAAM,kBAAkB,gFAA0B,CAAA;AACzD,eAAO,MAAM,uBAAuB;;EAElC,CAAA;AAEF,eAAO,MAAM,OAAO;;;;IAKlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAMvD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;kBANoB,MAAM;;kBAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;CA2BjD,CAAA;AAIH,eAAO,MAAM,YAAY;;;CAGvB,CAAA;AAIF,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAerC,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAU1D,CAAA"}
1
+ {"version":3,"file":"feedSocket.d.ts","sourceRoot":"","sources":["../../../src/test/apps/feedSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,eAAe,MAAM,gCAAgC,CAAA;AAMjE,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;EAKlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAMvD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;kBANoB,MAAM;;kBAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;CA8BjD,CAAA;AAIH,eAAO,MAAM,YAAY;;;CAGvB,CAAA;AAIF,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;oBASjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAU1D,CAAA"}
@@ -1,6 +1,6 @@
1
- import { Boolean, Effect, Match as M, Option, Schema as S } from 'effect';
1
+ import { Boolean, Effect, Option, Schema as S } from 'effect';
2
2
  import * as ManagedResource from '../../managedResource/index.js';
3
- import { m } from '../../message/index.js';
3
+ import { defineMessageUnion } from '../../message/index.js';
4
4
  import { evo } from '../../struct/index.js';
5
5
  // MODEL
6
6
  export const Model = S.Struct({
@@ -8,20 +8,12 @@ export const Model = S.Struct({
8
8
  status: S.Literals(['Disconnected', 'Connected', 'Failed']),
9
9
  });
10
10
  // MESSAGE
11
- export const ClickedToggleFeed = m('ClickedToggleFeed');
12
- export const AcquiredFeedSocket = m('AcquiredFeedSocket', {
13
- socketId: S.String,
11
+ export const Message = defineMessageUnion({
12
+ ClickedToggleFeed: {},
13
+ AcquiredFeedSocket: { socketId: S.String },
14
+ ReleasedFeedSocket: {},
15
+ FailedAcquireFeedSocket: { error: S.String },
14
16
  });
15
- export const ReleasedFeedSocket = m('ReleasedFeedSocket');
16
- export const FailedAcquireFeedSocket = m('FailedAcquireFeedSocket', {
17
- error: S.String,
18
- });
19
- export const Message = S.Union([
20
- ClickedToggleFeed,
21
- AcquiredFeedSocket,
22
- ReleasedFeedSocket,
23
- FailedAcquireFeedSocket,
24
- ]);
25
17
  const FeedSocketResource = ManagedResource.tag()('FeedSocket');
26
18
  const PresenceResource = ManagedResource.tag()('Presence');
27
19
  export const feedResources = ManagedResource.make()(entry => ({
@@ -30,18 +22,18 @@ export const feedResources = ManagedResource.make()(entry => ({
30
22
  modelToMaybeRequirements: model => model.isFeedOpen ? Option.some({ channel: 'general' }) : Option.none(),
31
23
  acquire: () => Effect.succeed({ socketId: 'live' }),
32
24
  release: () => Effect.void,
33
- onAcquired: socket => AcquiredFeedSocket({ socketId: socket.socketId }),
34
- onReleased: () => ReleasedFeedSocket(),
35
- onAcquireError: error => FailedAcquireFeedSocket({ error: String(error) }),
25
+ onAcquired: socket => Message.AcquiredFeedSocket({ socketId: socket.socketId }),
26
+ onReleased: () => Message.ReleasedFeedSocket(),
27
+ onAcquireError: error => Message.FailedAcquireFeedSocket({ error: String(error) }),
36
28
  }),
37
29
  presence: entry(S.Option(S.Null), {
38
30
  resource: PresenceResource,
39
31
  modelToMaybeRequirements: model => model.isFeedOpen ? Option.some(null) : Option.none(),
40
32
  acquire: () => Effect.succeed('online'),
41
33
  release: () => Effect.void,
42
- onAcquired: () => AcquiredFeedSocket({ socketId: 'presence' }),
43
- onReleased: () => ReleasedFeedSocket(),
44
- onAcquireError: error => FailedAcquireFeedSocket({ error: String(error) }),
34
+ onAcquired: () => Message.AcquiredFeedSocket({ socketId: 'presence' }),
35
+ onReleased: () => Message.ReleasedFeedSocket(),
36
+ onAcquireError: error => Message.FailedAcquireFeedSocket({ error: String(error) }),
45
37
  }),
46
38
  }));
47
39
  // INIT
@@ -50,20 +42,17 @@ export const initialModel = Model.make({
50
42
  status: 'Disconnected',
51
43
  });
52
44
  // UPDATE
53
- export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
45
+ export const update = (model, message) => Message.match(message, {
54
46
  ClickedToggleFeed: () => [evo(model, { isFeedOpen: Boolean.not }), []],
55
47
  AcquiredFeedSocket: () => [evo(model, { status: () => 'Connected' }), []],
56
48
  ReleasedFeedSocket: () => [
57
49
  evo(model, { status: () => 'Disconnected' }),
58
50
  [],
59
51
  ],
60
- FailedAcquireFeedSocket: () => [
61
- evo(model, { status: () => 'Failed' }),
62
- [],
63
- ],
64
- }));
52
+ FailedAcquireFeedSocket: () => [evo(model, { status: () => 'Failed' }), []],
53
+ });
65
54
  // VIEW
66
55
  export const view = (model, h) => h.div([], [
67
56
  h.span([h.Role('status')], [model.status]),
68
- h.button([h.OnClick(ClickedToggleFeed()), h.Role('button')], [model.isFeedOpen ? 'Close feed' : 'Open feed']),
57
+ h.button([h.OnClick(Message.ClickedToggleFeed()), h.Role('button')], [model.isFeedOpen ? 'Close feed' : 'Open feed']),
69
58
  ]);
@@ -5,13 +5,14 @@ export type Model = Readonly<{
5
5
  receivedFiles: ReadonlyArray<File>;
6
6
  }>;
7
7
  export declare const initialModel: Model;
8
- export declare const ReceivedFiles: import("../../schema/index.js").CallableTaggedStruct<"ReceivedFiles", {
9
- files: S.$Array<S.Schema<globalThis.File>>;
8
+ export declare const Message: import("../../schema/index.js").MessageUnion<{
9
+ readonly ReceivedFiles: {
10
+ readonly files: S.$Array<S.Schema<globalThis.File>>;
11
+ };
10
12
  }>;
11
- export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ReceivedFiles", {
12
- files: S.$Array<S.Schema<globalThis.File>>;
13
- }>]>;
14
13
  export type Message = typeof Message.Type;
15
- export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<never>];
14
+ export declare const update: (model: Model, message: Message) => readonly [Readonly<{
15
+ receivedFiles: ReadonlyArray<File>;
16
+ }>, readonly never[]];
16
17
  export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
17
18
  //# sourceMappingURL=fileUpload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["../../../src/test/apps/fileUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;CACnC,CAAC,CAAA;AAEF,eAAO,MAAM,YAAY,EAAE,KAA6B,CAAA;AAIxD,eAAO,MAAM,aAAa;;EAA+C,CAAA;AAEzE,eAAO,MAAM,OAAO;;IAA2B,CAAA;AAC/C,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAMrC,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA4B5D,CAAA"}
1
+ {"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["../../../src/test/apps/fileUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;CACnC,CAAC,CAAA;AAEF,eAAO,MAAM,YAAY,EAAE,KAA6B,CAAA;AAIxD,eAAO,MAAM,OAAO;;;;EAElB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;mBAfpC,aAAa,CAAC,IAAI,CAAC;qBAkBhC,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA4B5D,CAAA"}
@@ -1,14 +1,15 @@
1
- import { Match as M, Schema as S } from 'effect';
1
+ import { Schema as S } from 'effect';
2
2
  import { File } from '../../file/index.js';
3
- import { m } from '../../message/index.js';
3
+ import { defineMessageUnion } from '../../message/index.js';
4
4
  export const initialModel = { receivedFiles: [] };
5
5
  // MESSAGE
6
- export const ReceivedFiles = m('ReceivedFiles', { files: S.Array(File) });
7
- export const Message = S.Union([ReceivedFiles]);
6
+ export const Message = defineMessageUnion({
7
+ ReceivedFiles: { files: S.Array(File) },
8
+ });
8
9
  // UPDATE
9
- export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
10
+ export const update = (model, message) => Message.match(message, {
10
11
  ReceivedFiles: ({ files }) => [{ ...model, receivedFiles: files }, []],
11
- }));
12
+ });
12
13
  // VIEW
13
14
  export const view = (model, h) => {
14
15
  return h.div([], [
@@ -16,12 +17,12 @@ export const view = (model, h) => {
16
17
  h.Key('file-input'),
17
18
  h.AriaLabel('resume'),
18
19
  h.Type('file'),
19
- h.OnFileChange(files => ReceivedFiles({ files })),
20
+ h.OnFileChange(files => Message.ReceivedFiles({ files })),
20
21
  ]),
21
22
  h.div([
22
23
  h.Key('drop-zone'),
23
24
  h.AriaLabel('attachments'),
24
- h.OnDropFiles(files => ReceivedFiles({ files })),
25
+ h.OnDropFiles(files => Message.ReceivedFiles({ files })),
25
26
  ], ['Drop files here']),
26
27
  h.div([h.Key('received-count')], [`count=${String(model.receivedFiles.length)}`]),
27
28
  h.div([h.Key('received-names')], [`names=${model.receivedFiles.map(file => file.name).join(',')}`]),
@@ -4,23 +4,27 @@ export declare const ChildModel: S.Struct<{
4
4
  readonly status: S.Literals<readonly ["Idle", "Submitting", "Submitted"]>;
5
5
  }>;
6
6
  export type ChildModel = typeof ChildModel.Type;
7
- export declare const SubmittedForm: import("../../schema/index.js").CallableTaggedStruct<"SubmittedForm", {}>;
8
- export declare const SucceededSubmitForm: import("../../schema/index.js").CallableTaggedStruct<"SucceededSubmitForm", {
9
- id: S.String;
7
+ export declare const ChildMessage: import("../../schema/index.js").MessageUnion<{
8
+ readonly SubmittedForm: {};
9
+ readonly SucceededSubmitForm: {
10
+ readonly id: S.String;
11
+ };
12
+ readonly CancelledForm: {};
13
+ readonly CompletedResetForm: {};
10
14
  }>;
11
- export declare const CancelledForm: import("../../schema/index.js").CallableTaggedStruct<"CancelledForm", {}>;
12
- export declare const CompletedResetForm: import("../../schema/index.js").CallableTaggedStruct<"CompletedResetForm", {}>;
13
- export declare const ChildMessage: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededSubmitForm", {
14
- id: S.String;
15
- }>, import("../../schema/index.js").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"CompletedResetForm", {}>]>;
15
+ export declare const SubmittedForm: import("../../schema/index.js").CallableTaggedStruct<"SubmittedForm", {}>, SucceededSubmitForm: import("../../schema/index.js").CallableTaggedStruct<"SucceededSubmitForm", {
16
+ readonly id: S.String;
17
+ }>, CancelledForm: import("../../schema/index.js").CallableTaggedStruct<"CancelledForm", {}>, CompletedResetForm: import("../../schema/index.js").CallableTaggedStruct<"CompletedResetForm", {}>;
16
18
  export type ChildMessage = typeof ChildMessage.Type;
17
- export declare const RequestedSave: import("../../schema/index.js").CallableTaggedStruct<"RequestedSave", {
18
- id: S.String;
19
+ export declare const ChildOutMessage: import("../../schema/index.js").MessageUnion<{
20
+ readonly RequestedSave: {
21
+ readonly id: S.String;
22
+ };
23
+ readonly RequestedCancel: {};
19
24
  }>;
20
- export declare const RequestedCancel: import("../../schema/index.js").CallableTaggedStruct<"RequestedCancel", {}>;
21
- export declare const ChildOutMessage: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"RequestedSave", {
22
- id: S.String;
23
- }>, import("../../schema/index.js").CallableTaggedStruct<"RequestedCancel", {}>]>;
25
+ export declare const RequestedSave: import("../../schema/index.js").CallableTaggedStruct<"RequestedSave", {
26
+ readonly id: S.String;
27
+ }>, RequestedCancel: import("../../schema/index.js").CallableTaggedStruct<"RequestedCancel", {}>;
24
28
  export type ChildOutMessage = typeof ChildOutMessage.Type;
25
29
  export declare const SubmitForm: Command.CommandDefinitionNoArgs<"SubmitForm", Effect.Effect<{
26
30
  readonly _tag: "SucceededSubmitForm";
@@ -39,17 +43,29 @@ export declare const ParentModel: S.Struct<{
39
43
  readonly cancelled: S.Boolean;
40
44
  }>;
41
45
  export type ParentModel = typeof ParentModel.Type;
42
- export declare const GotChildMessage: import("../../schema/index.js").CallableTaggedStruct<"GotChildMessage", {
43
- message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededSubmitForm", {
44
- id: S.String;
45
- }>, import("../../schema/index.js").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"CompletedResetForm", {}>]>;
46
+ export declare const ParentMessage: import("../../schema/index.js").MessageUnion<{
47
+ readonly GotChildMessage: {
48
+ readonly message: import("../../schema/index.js").MessageUnion<{
49
+ readonly SubmittedForm: {};
50
+ readonly SucceededSubmitForm: {
51
+ readonly id: S.String;
52
+ };
53
+ readonly CancelledForm: {};
54
+ readonly CompletedResetForm: {};
55
+ }>;
56
+ };
57
+ readonly CompletedParentReset: {};
46
58
  }>;
47
- export declare const CompletedParentReset: import("../../schema/index.js").CallableTaggedStruct<"CompletedParentReset", {}>;
48
- export declare const ParentMessage: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"GotChildMessage", {
49
- message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"SubmittedForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededSubmitForm", {
50
- id: S.String;
51
- }>, import("../../schema/index.js").CallableTaggedStruct<"CancelledForm", {}>, import("../../schema/index.js").CallableTaggedStruct<"CompletedResetForm", {}>]>;
52
- }>, import("../../schema/index.js").CallableTaggedStruct<"CompletedParentReset", {}>]>;
59
+ export declare const GotChildMessage: import("../../schema/index.js").CallableTaggedStruct<"GotChildMessage", {
60
+ readonly message: import("../../schema/index.js").MessageUnion<{
61
+ readonly SubmittedForm: {};
62
+ readonly SucceededSubmitForm: {
63
+ readonly id: S.String;
64
+ };
65
+ readonly CancelledForm: {};
66
+ readonly CompletedResetForm: {};
67
+ }>;
68
+ }>, CompletedParentReset: import("../../schema/index.js").CallableTaggedStruct<"CompletedParentReset", {}>;
53
69
  export type ParentMessage = typeof ParentMessage.Type;
54
70
  export declare const initialParentModel: ParentModel;
55
71
  export declare const parentUpdate: (parentModel: ParentModel, message: ParentMessage) => readonly [ParentModel, ReadonlyArray<Command.Command<ParentMessage>>];
@@ -1 +1 @@
1
- {"version":3,"file":"formChild.d.ts","sourceRoot":"","sources":["../../../src/test/apps/formChild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhE,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AAKjD,eAAO,MAAM,UAAU;;EAErB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAI/C,eAAO,MAAM,aAAa,2EAAqB,CAAA;AAC/C,eAAO,MAAM,mBAAmB;;EAA6C,CAAA;AAC7E,eAAO,MAAM,aAAa,2EAAqB,CAAA;AAC/C,eAAO,MAAM,kBAAkB,gFAA0B,CAAA;AAEzD,eAAO,MAAM,YAAY;;+JAKvB,CAAA;AACF,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAInD,eAAO,MAAM,aAAa;;EAAuC,CAAA;AACjE,eAAO,MAAM,eAAe,6EAAuB,CAAA;AAEnD,eAAO,MAAM,eAAe;;iFAA4C,CAAA;AACxE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAIzD,eAAO,MAAM,UAAU;;;iBAGrB,CAAA;AAEF,eAAO,MAAM,SAAS;;iBAGpB,CAAA;AAIF,eAAO,MAAM,iBAAiB,EAAE,UAA+B,CAAA;AAI/D,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,YAAY,KACpB,SAAS,CACV,UAAU,EACV,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC5C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CA4B7B,CAAA;AAIH,eAAO,MAAM,WAAW;;;;;;EAItB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAIjD,eAAO,MAAM,eAAe;;;;EAE1B,CAAA;AACF,eAAO,MAAM,oBAAoB,kFAA4B,CAAA;AAE7D,eAAO,MAAM,aAAa;;;;sFAAmD,CAAA;AAC7E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAIrD,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAA;AAID,eAAO,MAAM,YAAY,GACvB,aAAa,WAAW,EACxB,SAAS,aAAa,KACrB,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAqCpE,CAAA"}
1
+ {"version":3,"file":"formChild.d.ts","sourceRoot":"","sources":["../../../src/test/apps/formChild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AAKjD,eAAO,MAAM,UAAU;;EAErB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAI/C,eAAO,MAAM,YAAY;;;;;;;EAKvB,CAAA;AAEF,eAAO,MACL,aAAa,6EACb,mBAAmB;;IACnB,aAAa,6EACb,kBAAkB,gFACJ,CAAA;AAEhB,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAA;AAInD,eAAO,MAAM,eAAe;;;;;EAG1B,CAAA;AAEF,eAAO,MAAQ,aAAa;;IAAE,eAAe,6EAAoB,CAAA;AAEjE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AAIzD,eAAO,MAAM,UAAU;;;iBAGrB,CAAA;AAEF,eAAO,MAAM,SAAS;;iBAGpB,CAAA;AAIF,eAAO,MAAM,iBAAiB,EAAE,UAA+B,CAAA;AAI/D,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,YAAY,KACpB,SAAS,CACV,UAAU,EACV,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC5C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAyB5B,CAAA;AAIJ,eAAO,MAAM,WAAW;;;;;;EAItB,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAIjD,eAAO,MAAM,aAAa;;;;;;;;;;;;EAGxB,CAAA;AAEF,eAAO,MAAQ,eAAe;;;;;;;;;IAAE,oBAAoB,kFAAkB,CAAA;AAEtE,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAIrD,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAA;AAID,eAAO,MAAM,YAAY,GACvB,aAAa,WAAW,EACxB,SAAS,aAAa,KACrB,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CA+BnE,CAAA"}
@@ -1,38 +1,37 @@
1
- import { Effect, Match as M, Option, Schema as S } from 'effect';
1
+ import { Effect, Option, Schema as S } from 'effect';
2
2
  import * as Command from '../../command/index.js';
3
- import { m } from '../../message/index.js';
3
+ import { defineMessageUnion } from '../../message/index.js';
4
4
  // CHILD MODEL
5
5
  export const ChildModel = S.Struct({
6
6
  status: S.Literals(['Idle', 'Submitting', 'Submitted']),
7
7
  });
8
8
  // CHILD MESSAGE
9
- export const SubmittedForm = m('SubmittedForm');
10
- export const SucceededSubmitForm = m('SucceededSubmitForm', { id: S.String });
11
- export const CancelledForm = m('CancelledForm');
12
- export const CompletedResetForm = m('CompletedResetForm');
13
- export const ChildMessage = S.Union([
14
- SubmittedForm,
15
- SucceededSubmitForm,
16
- CancelledForm,
17
- CompletedResetForm,
18
- ]);
9
+ export const ChildMessage = defineMessageUnion({
10
+ SubmittedForm: {},
11
+ SucceededSubmitForm: { id: S.String },
12
+ CancelledForm: {},
13
+ CompletedResetForm: {},
14
+ });
15
+ export const { SubmittedForm, SucceededSubmitForm, CancelledForm, CompletedResetForm, } = ChildMessage;
19
16
  // CHILD OUT MESSAGE
20
- export const RequestedSave = m('RequestedSave', { id: S.String });
21
- export const RequestedCancel = m('RequestedCancel');
22
- export const ChildOutMessage = S.Union([RequestedSave, RequestedCancel]);
17
+ export const ChildOutMessage = defineMessageUnion({
18
+ RequestedSave: { id: S.String },
19
+ RequestedCancel: {},
20
+ });
21
+ export const { RequestedSave, RequestedCancel } = ChildOutMessage;
23
22
  // CHILD COMMAND
24
23
  export const SubmitForm = Command.define('SubmitForm', {
25
- messages: [SucceededSubmitForm],
26
- execute: Effect.sync(() => SucceededSubmitForm({ id: 'abc' })),
24
+ messages: [ChildMessage.SucceededSubmitForm],
25
+ execute: Effect.sync(() => ChildMessage.SucceededSubmitForm({ id: 'abc' })),
27
26
  });
28
27
  export const ResetForm = Command.define('ResetForm', {
29
- messages: [CompletedResetForm],
30
- execute: Effect.sync(() => CompletedResetForm()),
28
+ messages: [ChildMessage.CompletedResetForm],
29
+ execute: Effect.sync(() => ChildMessage.CompletedResetForm()),
31
30
  });
32
31
  // CHILD INIT
33
32
  export const initialChildModel = { status: 'Idle' };
34
33
  // CHILD UPDATE
35
- export const childUpdate = (_model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
34
+ export const childUpdate = (_model, message) => ChildMessage.match(message, {
36
35
  SubmittedForm: () => [
37
36
  { status: 'Submitting' },
38
37
  [SubmitForm()],
@@ -41,15 +40,15 @@ export const childUpdate = (_model, message) => M.value(message).pipe(M.withRetu
41
40
  SucceededSubmitForm: ({ id }) => [
42
41
  { status: 'Submitted' },
43
42
  [ResetForm()],
44
- Option.some(RequestedSave({ id })),
43
+ Option.some(ChildOutMessage.RequestedSave({ id })),
45
44
  ],
46
45
  CancelledForm: () => [
47
46
  { status: 'Idle' },
48
47
  [],
49
- Option.some(RequestedCancel()),
48
+ Option.some(ChildOutMessage.RequestedCancel()),
50
49
  ],
51
50
  CompletedResetForm: () => [{ status: 'Idle' }, [], Option.none()],
52
- }));
51
+ });
53
52
  // PARENT MODEL
54
53
  export const ParentModel = S.Struct({
55
54
  child: ChildModel,
@@ -57,11 +56,11 @@ export const ParentModel = S.Struct({
57
56
  cancelled: S.Boolean,
58
57
  });
59
58
  // PARENT MESSAGE
60
- export const GotChildMessage = m('GotChildMessage', {
61
- message: ChildMessage,
59
+ export const ParentMessage = defineMessageUnion({
60
+ GotChildMessage: { message: ChildMessage },
61
+ CompletedParentReset: {},
62
62
  });
63
- export const CompletedParentReset = m('CompletedParentReset');
64
- export const ParentMessage = S.Union([GotChildMessage, CompletedParentReset]);
63
+ export const { GotChildMessage, CompletedParentReset } = ParentMessage;
65
64
  // PARENT INIT
66
65
  export const initialParentModel = {
67
66
  child: { status: 'Idle' },
@@ -69,12 +68,12 @@ export const initialParentModel = {
69
68
  cancelled: false,
70
69
  };
71
70
  // PARENT UPDATE
72
- export const parentUpdate = (parentModel, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
71
+ export const parentUpdate = (parentModel, message) => ParentMessage.match(message, {
73
72
  GotChildMessage: ({ message: childMessage }) => {
74
73
  const [nextChild, commands, maybeOutMessage] = childUpdate(parentModel.child, childMessage);
75
74
  const nextParent = Option.match(maybeOutMessage, {
76
75
  onNone: () => ({ ...parentModel, child: nextChild }),
77
- onSome: outMessage => M.value(outMessage).pipe(M.withReturnType(), M.tagsExhaustive({
76
+ onSome: outMessage => ChildOutMessage.match(outMessage, {
78
77
  RequestedSave: ({ id }) => ({
79
78
  ...parentModel,
80
79
  child: nextChild,
@@ -85,10 +84,10 @@ export const parentUpdate = (parentModel, message) => M.value(message).pipe(M.wi
85
84
  child: nextChild,
86
85
  cancelled: true,
87
86
  }),
88
- })),
87
+ }),
89
88
  });
90
- const mappedCommands = Command.mapMessages(commands, childMessage => GotChildMessage({ message: childMessage }));
89
+ const mappedCommands = Command.mapMessages(commands, childMessage => ParentMessage.GotChildMessage({ message: childMessage }));
91
90
  return [nextParent, mappedCommands];
92
91
  },
93
92
  CompletedParentReset: () => [parentModel, []],
94
- }));
93
+ });
@@ -8,19 +8,24 @@ export declare const Model: S.Struct<{
8
8
  readonly changed: S.String;
9
9
  }>;
10
10
  export type Model = typeof Model.Type;
11
- export declare const ClickedButton: import("../../schema/index.js").CallableTaggedStruct<"ClickedButton", {}>;
12
- export declare const DoubleClickedButton: import("../../schema/index.js").CallableTaggedStruct<"DoubleClickedButton", {}>;
13
- export declare const HoveredTarget: import("../../schema/index.js").CallableTaggedStruct<"HoveredTarget", {}>;
14
- export declare const FocusedInput: import("../../schema/index.js").CallableTaggedStruct<"FocusedInput", {}>;
15
- export declare const BlurredInput: import("../../schema/index.js").CallableTaggedStruct<"BlurredInput", {}>;
16
- export declare const ChangedSelect: import("../../schema/index.js").CallableTaggedStruct<"ChangedSelect", {
17
- value: S.String;
11
+ export declare const Message: import("../../schema/index.js").MessageUnion<{
12
+ readonly ClickedButton: {};
13
+ readonly DoubleClickedButton: {};
14
+ readonly HoveredTarget: {};
15
+ readonly FocusedInput: {};
16
+ readonly BlurredInput: {};
17
+ readonly ChangedSelect: {
18
+ readonly value: S.String;
19
+ };
18
20
  }>;
19
- export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedButton", {}>, import("../../schema/index.js").CallableTaggedStruct<"DoubleClickedButton", {}>, import("../../schema/index.js").CallableTaggedStruct<"HoveredTarget", {}>, import("../../schema/index.js").CallableTaggedStruct<"FocusedInput", {}>, import("../../schema/index.js").CallableTaggedStruct<"BlurredInput", {}>, import("../../schema/index.js").CallableTaggedStruct<"ChangedSelect", {
20
- value: S.String;
21
- }>]>;
22
21
  export type Message = typeof Message.Type;
23
22
  export declare const initialModel: Model;
24
- export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<never>];
23
+ export declare const update: (model: Model, message: Message) => readonly [{
24
+ readonly clicks: number;
25
+ readonly doubleClicks: number;
26
+ readonly hovered: boolean;
27
+ readonly focused: boolean;
28
+ readonly changed: string;
29
+ }, readonly never[]];
25
30
  export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
26
31
  //# sourceMappingURL=interactions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../src/test/apps/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;;;;EAMhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,aAAa,2EAAqB,CAAA;AAC/C,eAAO,MAAM,mBAAmB,iFAA2B,CAAA;AAC3D,eAAO,MAAM,aAAa,2EAAqB,CAAA;AAC/C,eAAO,MAAM,YAAY,0EAAoB,CAAA;AAC7C,eAAO,MAAM,YAAY,0EAAoB,CAAA;AAC7C,eAAO,MAAM,aAAa;;EAA0C,CAAA;AAEpE,eAAO,MAAM,OAAO;;IAOlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAID,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAcrC,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA4B5D,CAAA"}
1
+ {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../src/test/apps/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;;;;EAMhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;EAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAID,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;oBAWjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA+B5D,CAAA"}
@@ -1,5 +1,5 @@
1
- import { Match as M, Schema as S } from 'effect';
2
- import { m } from '../../message/index.js';
1
+ import { Schema as S } from 'effect';
2
+ import { defineMessageUnion } from '../../message/index.js';
3
3
  // MODEL
4
4
  export const Model = S.Struct({
5
5
  clicks: S.Number,
@@ -9,20 +9,14 @@ export const Model = S.Struct({
9
9
  changed: S.String,
10
10
  });
11
11
  // MESSAGE
12
- export const ClickedButton = m('ClickedButton');
13
- export const DoubleClickedButton = m('DoubleClickedButton');
14
- export const HoveredTarget = m('HoveredTarget');
15
- export const FocusedInput = m('FocusedInput');
16
- export const BlurredInput = m('BlurredInput');
17
- export const ChangedSelect = m('ChangedSelect', { value: S.String });
18
- export const Message = S.Union([
19
- ClickedButton,
20
- DoubleClickedButton,
21
- HoveredTarget,
22
- FocusedInput,
23
- BlurredInput,
24
- ChangedSelect,
25
- ]);
12
+ export const Message = defineMessageUnion({
13
+ ClickedButton: {},
14
+ DoubleClickedButton: {},
15
+ HoveredTarget: {},
16
+ FocusedInput: {},
17
+ BlurredInput: {},
18
+ ChangedSelect: { value: S.String },
19
+ });
26
20
  // INIT
27
21
  export const initialModel = {
28
22
  clicks: 0,
@@ -32,7 +26,7 @@ export const initialModel = {
32
26
  changed: '',
33
27
  };
34
28
  // UPDATE
35
- export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
29
+ export const update = (model, message) => Message.match(message, {
36
30
  ClickedButton: () => [{ ...model, clicks: model.clicks + 1 }, []],
37
31
  DoubleClickedButton: () => [
38
32
  { ...model, doubleClicks: model.doubleClicks + 1 },
@@ -42,23 +36,26 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
42
36
  FocusedInput: () => [{ ...model, focused: true }, []],
43
37
  BlurredInput: () => [{ ...model, focused: false }, []],
44
38
  ChangedSelect: ({ value }) => [{ ...model, changed: value }, []],
45
- }));
39
+ });
46
40
  // VIEW
47
41
  export const view = (model, h) => {
48
42
  return h.div([], [
49
43
  h.button([
50
- h.OnClick(ClickedButton()),
51
- h.OnDoubleClick(DoubleClickedButton()),
52
- h.OnMouseEnter(HoveredTarget()),
44
+ h.OnClick(Message.ClickedButton()),
45
+ h.OnDoubleClick(Message.DoubleClickedButton()),
46
+ h.OnMouseEnter(Message.HoveredTarget()),
53
47
  h.AriaLabel('action'),
54
48
  ], [`clicks=${model.clicks} dbl=${model.doubleClicks}`]),
55
49
  h.input([
56
50
  h.Role('textbox'),
57
51
  h.AriaLabel('name'),
58
- h.OnFocus(FocusedInput()),
59
- h.OnBlur(BlurredInput()),
52
+ h.OnFocus(Message.FocusedInput()),
53
+ h.OnBlur(Message.BlurredInput()),
60
54
  ]),
61
- h.select([h.AriaLabel('fruit'), h.OnChange(value => ChangedSelect({ value }))], [
55
+ h.select([
56
+ h.AriaLabel('fruit'),
57
+ h.OnChange(value => Message.ChangedSelect({ value })),
58
+ ], [
62
59
  h.option([h.Value('apple')], ['Apple']),
63
60
  h.option([h.Value('banana')], ['Banana']),
64
61
  ]),
@@ -5,19 +5,19 @@ export declare const Model: S.Struct<{
5
5
  readonly isShifted: S.Boolean;
6
6
  }>;
7
7
  export type Model = typeof Model.Type;
8
- export declare const PressedKey: import("../../schema/index.js").CallableTaggedStruct<"PressedKey", {
9
- key: S.String;
8
+ export declare const Message: import("../../schema/index.js").MessageUnion<{
9
+ readonly PressedKey: {
10
+ readonly key: S.String;
11
+ };
12
+ readonly PressedShiftKey: {
13
+ readonly key: S.String;
14
+ };
10
15
  }>;
11
- export declare const PressedShiftKey: import("../../schema/index.js").CallableTaggedStruct<"PressedShiftKey", {
12
- key: S.String;
13
- }>;
14
- export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"PressedKey", {
15
- key: S.String;
16
- }>, import("../../schema/index.js").CallableTaggedStruct<"PressedShiftKey", {
17
- key: S.String;
18
- }>]>;
19
16
  export type Message = typeof Message.Type;
20
17
  export declare const initialModel: Model;
21
- export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<never>];
18
+ export declare const update: (model: Model, message: Message) => readonly [{
19
+ readonly lastKey: string;
20
+ readonly isShifted: boolean;
21
+ }, readonly never[]];
22
22
  export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
23
23
  //# sourceMappingURL=keypress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keypress.d.ts","sourceRoot":"","sources":["../../../src/test/apps/keypress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,UAAU;;EAAqC,CAAA;AAC5D,eAAO,MAAM,eAAe;;EAA0C,CAAA;AAEtE,eAAO,MAAM,OAAO;;;;IAAyC,CAAA;AAC7D,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAG1B,CAAA;AAID,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAarC,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAkB5D,CAAA"}
1
+ {"version":3,"file":"keypress.d.ts","sourceRoot":"","sources":["../../../src/test/apps/keypress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;EAGlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAG1B,CAAA;AAID,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;oBAOjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAoB5D,CAAA"}