effect-app 4.0.0 → 4.0.2

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 (83) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/Array.d.ts +0 -17
  3. package/dist/Array.d.ts.map +1 -1
  4. package/dist/Array.js +2 -26
  5. package/dist/Chunk.d.ts +3 -27
  6. package/dist/Chunk.d.ts.map +1 -1
  7. package/dist/Chunk.js +4 -39
  8. package/dist/DateTime.d.ts +33 -0
  9. package/dist/DateTime.d.ts.map +1 -0
  10. package/dist/DateTime.js +18 -0
  11. package/dist/Effect.d.ts +0 -11
  12. package/dist/Effect.d.ts.map +1 -1
  13. package/dist/Effect.js +3 -18
  14. package/dist/Function.d.ts +0 -4
  15. package/dist/Function.d.ts.map +1 -1
  16. package/dist/Function.js +1 -7
  17. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  18. package/dist/Model/Repository/internal/internal.js +4 -5
  19. package/dist/Model/dsl.d.ts +4 -3
  20. package/dist/Model/dsl.d.ts.map +1 -1
  21. package/dist/Model/dsl.js +6 -4
  22. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  23. package/dist/Model/query/new-kid-interpreter.js +5 -6
  24. package/dist/Option.d.ts +0 -2
  25. package/dist/Option.d.ts.map +1 -1
  26. package/dist/Option.js +1 -7
  27. package/dist/Pure.d.ts +4 -4
  28. package/dist/Pure.d.ts.map +1 -1
  29. package/dist/Pure.js +16 -16
  30. package/dist/Schema/ext.d.ts +0 -21
  31. package/dist/Schema/ext.d.ts.map +1 -1
  32. package/dist/Schema/ext.js +4 -10
  33. package/dist/Schema.d.ts +1 -1
  34. package/dist/Schema.d.ts.map +1 -1
  35. package/dist/Schema.js +2 -2
  36. package/dist/Set.d.ts.map +1 -1
  37. package/dist/Set.js +6 -5
  38. package/dist/client/apiClientFactory.d.ts.map +1 -1
  39. package/dist/client/apiClientFactory.js +7 -6
  40. package/dist/migration/nativeEffect.d.ts +21 -0
  41. package/dist/migration/nativeEffect.d.ts.map +1 -0
  42. package/dist/migration/nativeEffect.js +598 -0
  43. package/dist/utils.d.ts +0 -6
  44. package/dist/utils.d.ts.map +1 -1
  45. package/dist/utils.js +1 -13
  46. package/dist/waitingGate.d.ts +38 -0
  47. package/dist/waitingGate.d.ts.map +1 -0
  48. package/dist/waitingGate.js +63 -0
  49. package/dist/withToast.d.ts.map +1 -1
  50. package/dist/withToast.js +42 -3
  51. package/package.json +2 -3
  52. package/src/Array.ts +4 -36
  53. package/src/Chunk.ts +4 -53
  54. package/src/DateTime.ts +473 -0
  55. package/src/Effect.ts +3 -22
  56. package/src/Function.ts +0 -7
  57. package/src/Model/Repository/internal/internal.ts +3 -4
  58. package/src/Model/dsl.ts +5 -4
  59. package/src/Model/query/new-kid-interpreter.ts +4 -5
  60. package/src/Option.ts +1 -8
  61. package/src/Pure.ts +15 -15
  62. package/src/Schema/ext.ts +3 -10
  63. package/src/Schema.ts +1 -1
  64. package/src/Set.ts +5 -4
  65. package/src/client/apiClientFactory.ts +8 -7
  66. package/src/migration/nativeEffect.ts +645 -0
  67. package/src/utils.ts +0 -17
  68. package/src/waitingGate.ts +82 -0
  69. package/src/withToast.ts +51 -5
  70. package/test/dateTimeLocal.test.ts +55 -0
  71. package/test/dist/dateTimeLocal.test.d.ts.map +1 -0
  72. package/test/dist/nativeEffectMigration.test.d.ts.map +1 -0
  73. package/test/dist/waitingGate.test.d.ts.map +1 -0
  74. package/test/nativeEffectMigration.test.ts +77 -0
  75. package/test/waitingGate.test.ts +64 -0
  76. package/dist/_ext/date.d.ts +0 -15
  77. package/dist/_ext/date.d.ts.map +0 -1
  78. package/dist/_ext/date.js +0 -16
  79. package/dist/_ext/misc.d.ts +0 -17
  80. package/dist/_ext/misc.d.ts.map +0 -1
  81. package/dist/_ext/misc.js +0 -19
  82. package/src/_ext/date.ts +0 -27
  83. package/src/_ext/misc.ts +0 -49
@@ -0,0 +1,473 @@
1
+ import * as DateTime from "effect/DateTime"
2
+
3
+ /**
4
+ * The same instant as `date`, zoned with the process timezone.
5
+ *
6
+ * A JavaScript `Date` stores no zone. This attaches `DateTime.zoneMakeLocal()` without moving the instant.
7
+ */
8
+ export const makeZonedLocal = (date: Date): DateTime.Zoned =>
9
+ DateTime.makeZonedUnsafe(date, { timeZone: DateTime.zoneMakeLocal() })
10
+
11
+ /**
12
+ * Zones `date` with the process timezone, runs the functions, then returns the instant with `DateTime.toDateUtc`.
13
+ *
14
+ * Accepts as many functions as `pipe`. The last function must return a `DateTime`. Calendar parts follow the process timezone, as `Date#setDate` does.
15
+ */
16
+ export function pipeZonedLocal(date: Date): Date
17
+ export function pipeZonedLocal<A extends DateTime.DateTime = never>(
18
+ date: Date,
19
+ ab: (self: DateTime.Zoned) => A
20
+ ): Date
21
+ export function pipeZonedLocal<A = never, B extends DateTime.DateTime = never>(
22
+ date: Date,
23
+ ab: (self: DateTime.Zoned) => A,
24
+ bc: (a: A) => B
25
+ ): Date
26
+ export function pipeZonedLocal<A = never, B = never, C extends DateTime.DateTime = never>(
27
+ date: Date,
28
+ ab: (self: DateTime.Zoned) => A,
29
+ bc: (a: A) => B,
30
+ cd: (b: B) => C
31
+ ): Date
32
+ export function pipeZonedLocal<
33
+ A = never,
34
+ B = never,
35
+ C = never,
36
+ D extends DateTime.DateTime = never
37
+ >(
38
+ date: Date,
39
+ ab: (self: DateTime.Zoned) => A,
40
+ bc: (a: A) => B,
41
+ cd: (b: B) => C,
42
+ de: (c: C) => D
43
+ ): Date
44
+ export function pipeZonedLocal<
45
+ A = never,
46
+ B = never,
47
+ C = never,
48
+ D = never,
49
+ E extends DateTime.DateTime = never
50
+ >(
51
+ date: Date,
52
+ ab: (self: DateTime.Zoned) => A,
53
+ bc: (a: A) => B,
54
+ cd: (b: B) => C,
55
+ de: (c: C) => D,
56
+ ef: (d: D) => E
57
+ ): Date
58
+ export function pipeZonedLocal<
59
+ A = never,
60
+ B = never,
61
+ C = never,
62
+ D = never,
63
+ E = never,
64
+ F extends DateTime.DateTime = never
65
+ >(
66
+ date: Date,
67
+ ab: (self: DateTime.Zoned) => A,
68
+ bc: (a: A) => B,
69
+ cd: (b: B) => C,
70
+ de: (c: C) => D,
71
+ ef: (d: D) => E,
72
+ fg: (e: E) => F
73
+ ): Date
74
+ export function pipeZonedLocal<
75
+ A = never,
76
+ B = never,
77
+ C = never,
78
+ D = never,
79
+ E = never,
80
+ F = never,
81
+ G extends DateTime.DateTime = never
82
+ >(
83
+ date: Date,
84
+ ab: (self: DateTime.Zoned) => A,
85
+ bc: (a: A) => B,
86
+ cd: (b: B) => C,
87
+ de: (c: C) => D,
88
+ ef: (d: D) => E,
89
+ fg: (e: E) => F,
90
+ gh: (f: F) => G
91
+ ): Date
92
+ export function pipeZonedLocal<
93
+ A = never,
94
+ B = never,
95
+ C = never,
96
+ D = never,
97
+ E = never,
98
+ F = never,
99
+ G = never,
100
+ H extends DateTime.DateTime = never
101
+ >(
102
+ date: Date,
103
+ ab: (self: DateTime.Zoned) => A,
104
+ bc: (a: A) => B,
105
+ cd: (b: B) => C,
106
+ de: (c: C) => D,
107
+ ef: (d: D) => E,
108
+ fg: (e: E) => F,
109
+ gh: (f: F) => G,
110
+ hi: (g: G) => H
111
+ ): Date
112
+ export function pipeZonedLocal<
113
+ A = never,
114
+ B = never,
115
+ C = never,
116
+ D = never,
117
+ E = never,
118
+ F = never,
119
+ G = never,
120
+ H = never,
121
+ I extends DateTime.DateTime = never
122
+ >(
123
+ date: Date,
124
+ ab: (self: DateTime.Zoned) => A,
125
+ bc: (a: A) => B,
126
+ cd: (b: B) => C,
127
+ de: (c: C) => D,
128
+ ef: (d: D) => E,
129
+ fg: (e: E) => F,
130
+ gh: (f: F) => G,
131
+ hi: (g: G) => H,
132
+ ij: (h: H) => I
133
+ ): Date
134
+ export function pipeZonedLocal<
135
+ A = never,
136
+ B = never,
137
+ C = never,
138
+ D = never,
139
+ E = never,
140
+ F = never,
141
+ G = never,
142
+ H = never,
143
+ I = never,
144
+ J extends DateTime.DateTime = never
145
+ >(
146
+ date: Date,
147
+ ab: (self: DateTime.Zoned) => A,
148
+ bc: (a: A) => B,
149
+ cd: (b: B) => C,
150
+ de: (c: C) => D,
151
+ ef: (d: D) => E,
152
+ fg: (e: E) => F,
153
+ gh: (f: F) => G,
154
+ hi: (g: G) => H,
155
+ ij: (h: H) => I,
156
+ jk: (i: I) => J
157
+ ): Date
158
+ export function pipeZonedLocal<
159
+ A = never,
160
+ B = never,
161
+ C = never,
162
+ D = never,
163
+ E = never,
164
+ F = never,
165
+ G = never,
166
+ H = never,
167
+ I = never,
168
+ J = never,
169
+ K extends DateTime.DateTime = never
170
+ >(
171
+ date: Date,
172
+ ab: (self: DateTime.Zoned) => A,
173
+ bc: (a: A) => B,
174
+ cd: (b: B) => C,
175
+ de: (c: C) => D,
176
+ ef: (d: D) => E,
177
+ fg: (e: E) => F,
178
+ gh: (f: F) => G,
179
+ hi: (g: G) => H,
180
+ ij: (h: H) => I,
181
+ jk: (i: I) => J,
182
+ kl: (j: J) => K
183
+ ): Date
184
+ export function pipeZonedLocal<
185
+ A = never,
186
+ B = never,
187
+ C = never,
188
+ D = never,
189
+ E = never,
190
+ F = never,
191
+ G = never,
192
+ H = never,
193
+ I = never,
194
+ J = never,
195
+ K = never,
196
+ L extends DateTime.DateTime = never
197
+ >(
198
+ date: Date,
199
+ ab: (self: DateTime.Zoned) => A,
200
+ bc: (a: A) => B,
201
+ cd: (b: B) => C,
202
+ de: (c: C) => D,
203
+ ef: (d: D) => E,
204
+ fg: (e: E) => F,
205
+ gh: (f: F) => G,
206
+ hi: (g: G) => H,
207
+ ij: (h: H) => I,
208
+ jk: (i: I) => J,
209
+ kl: (j: J) => K,
210
+ lm: (k: K) => L
211
+ ): Date
212
+ export function pipeZonedLocal<
213
+ A = never,
214
+ B = never,
215
+ C = never,
216
+ D = never,
217
+ E = never,
218
+ F = never,
219
+ G = never,
220
+ H = never,
221
+ I = never,
222
+ J = never,
223
+ K = never,
224
+ L = never,
225
+ M extends DateTime.DateTime = never
226
+ >(
227
+ date: Date,
228
+ ab: (self: DateTime.Zoned) => A,
229
+ bc: (a: A) => B,
230
+ cd: (b: B) => C,
231
+ de: (c: C) => D,
232
+ ef: (d: D) => E,
233
+ fg: (e: E) => F,
234
+ gh: (f: F) => G,
235
+ hi: (g: G) => H,
236
+ ij: (h: H) => I,
237
+ jk: (i: I) => J,
238
+ kl: (j: J) => K,
239
+ lm: (k: K) => L,
240
+ mn: (l: L) => M
241
+ ): Date
242
+ export function pipeZonedLocal<
243
+ A = never,
244
+ B = never,
245
+ C = never,
246
+ D = never,
247
+ E = never,
248
+ F = never,
249
+ G = never,
250
+ H = never,
251
+ I = never,
252
+ J = never,
253
+ K = never,
254
+ L = never,
255
+ M = never,
256
+ N extends DateTime.DateTime = never
257
+ >(
258
+ date: Date,
259
+ ab: (self: DateTime.Zoned) => A,
260
+ bc: (a: A) => B,
261
+ cd: (b: B) => C,
262
+ de: (c: C) => D,
263
+ ef: (d: D) => E,
264
+ fg: (e: E) => F,
265
+ gh: (f: F) => G,
266
+ hi: (g: G) => H,
267
+ ij: (h: H) => I,
268
+ jk: (i: I) => J,
269
+ kl: (j: J) => K,
270
+ lm: (k: K) => L,
271
+ mn: (l: L) => M,
272
+ no: (m: M) => N
273
+ ): Date
274
+ export function pipeZonedLocal<
275
+ A = never,
276
+ B = never,
277
+ C = never,
278
+ D = never,
279
+ E = never,
280
+ F = never,
281
+ G = never,
282
+ H = never,
283
+ I = never,
284
+ J = never,
285
+ K = never,
286
+ L = never,
287
+ M = never,
288
+ N = never,
289
+ O extends DateTime.DateTime = never
290
+ >(
291
+ date: Date,
292
+ ab: (self: DateTime.Zoned) => A,
293
+ bc: (a: A) => B,
294
+ cd: (b: B) => C,
295
+ de: (c: C) => D,
296
+ ef: (d: D) => E,
297
+ fg: (e: E) => F,
298
+ gh: (f: F) => G,
299
+ hi: (g: G) => H,
300
+ ij: (h: H) => I,
301
+ jk: (i: I) => J,
302
+ kl: (j: J) => K,
303
+ lm: (k: K) => L,
304
+ mn: (l: L) => M,
305
+ no: (m: M) => N,
306
+ op: (n: N) => O
307
+ ): Date
308
+ export function pipeZonedLocal<
309
+ A = never,
310
+ B = never,
311
+ C = never,
312
+ D = never,
313
+ E = never,
314
+ F = never,
315
+ G = never,
316
+ H = never,
317
+ I = never,
318
+ J = never,
319
+ K = never,
320
+ L = never,
321
+ M = never,
322
+ N = never,
323
+ O = never,
324
+ P extends DateTime.DateTime = never
325
+ >(
326
+ date: Date,
327
+ ab: (self: DateTime.Zoned) => A,
328
+ bc: (a: A) => B,
329
+ cd: (b: B) => C,
330
+ de: (c: C) => D,
331
+ ef: (d: D) => E,
332
+ fg: (e: E) => F,
333
+ gh: (f: F) => G,
334
+ hi: (g: G) => H,
335
+ ij: (h: H) => I,
336
+ jk: (i: I) => J,
337
+ kl: (j: J) => K,
338
+ lm: (k: K) => L,
339
+ mn: (l: L) => M,
340
+ no: (m: M) => N,
341
+ op: (n: N) => O,
342
+ pq: (o: O) => P
343
+ ): Date
344
+ export function pipeZonedLocal<
345
+ A = never,
346
+ B = never,
347
+ C = never,
348
+ D = never,
349
+ E = never,
350
+ F = never,
351
+ G = never,
352
+ H = never,
353
+ I = never,
354
+ J = never,
355
+ K = never,
356
+ L = never,
357
+ M = never,
358
+ N = never,
359
+ O = never,
360
+ P = never,
361
+ Q extends DateTime.DateTime = never
362
+ >(
363
+ date: Date,
364
+ ab: (self: DateTime.Zoned) => A,
365
+ bc: (a: A) => B,
366
+ cd: (b: B) => C,
367
+ de: (c: C) => D,
368
+ ef: (d: D) => E,
369
+ fg: (e: E) => F,
370
+ gh: (f: F) => G,
371
+ hi: (g: G) => H,
372
+ ij: (h: H) => I,
373
+ jk: (i: I) => J,
374
+ kl: (j: J) => K,
375
+ lm: (k: K) => L,
376
+ mn: (l: L) => M,
377
+ no: (m: M) => N,
378
+ op: (n: N) => O,
379
+ pq: (o: O) => P,
380
+ qr: (p: P) => Q
381
+ ): Date
382
+ export function pipeZonedLocal<
383
+ A = never,
384
+ B = never,
385
+ C = never,
386
+ D = never,
387
+ E = never,
388
+ F = never,
389
+ G = never,
390
+ H = never,
391
+ I = never,
392
+ J = never,
393
+ K = never,
394
+ L = never,
395
+ M = never,
396
+ N = never,
397
+ O = never,
398
+ P = never,
399
+ Q = never,
400
+ R extends DateTime.DateTime = never
401
+ >(
402
+ date: Date,
403
+ ab: (self: DateTime.Zoned) => A,
404
+ bc: (a: A) => B,
405
+ cd: (b: B) => C,
406
+ de: (c: C) => D,
407
+ ef: (d: D) => E,
408
+ fg: (e: E) => F,
409
+ gh: (f: F) => G,
410
+ hi: (g: G) => H,
411
+ ij: (h: H) => I,
412
+ jk: (i: I) => J,
413
+ kl: (j: J) => K,
414
+ lm: (k: K) => L,
415
+ mn: (l: L) => M,
416
+ no: (m: M) => N,
417
+ op: (n: N) => O,
418
+ pq: (o: O) => P,
419
+ qr: (p: P) => Q,
420
+ rs: (q: Q) => R
421
+ ): Date
422
+ export function pipeZonedLocal<
423
+ A = never,
424
+ B = never,
425
+ C = never,
426
+ D = never,
427
+ E = never,
428
+ F = never,
429
+ G = never,
430
+ H = never,
431
+ I = never,
432
+ J = never,
433
+ K = never,
434
+ L = never,
435
+ M = never,
436
+ N = never,
437
+ O = never,
438
+ P = never,
439
+ Q = never,
440
+ R = never,
441
+ S extends DateTime.DateTime = never
442
+ >(
443
+ date: Date,
444
+ ab: (self: DateTime.Zoned) => A,
445
+ bc: (a: A) => B,
446
+ cd: (b: B) => C,
447
+ de: (c: C) => D,
448
+ ef: (d: D) => E,
449
+ fg: (e: E) => F,
450
+ gh: (f: F) => G,
451
+ hi: (g: G) => H,
452
+ ij: (h: H) => I,
453
+ jk: (i: I) => J,
454
+ kl: (j: J) => K,
455
+ lm: (k: K) => L,
456
+ mn: (l: L) => M,
457
+ no: (m: M) => N,
458
+ op: (n: N) => O,
459
+ pq: (o: O) => P,
460
+ qr: (p: P) => Q,
461
+ rs: (q: Q) => R,
462
+ st: (r: R) => S
463
+ ): Date
464
+ export function pipeZonedLocal(date: Date, ...steps: ReadonlyArray<(value: any) => any>): Date {
465
+ let current: unknown = makeZonedLocal(date)
466
+ for (const step of steps) {
467
+ current = step(current)
468
+ }
469
+ if (!DateTime.isDateTime(current)) {
470
+ throw new TypeError("pipeZonedLocal must finish on a DateTime")
471
+ }
472
+ return DateTime.toDateUtc(current)
473
+ }
package/src/Effect.ts CHANGED
@@ -2,15 +2,13 @@
2
2
  /* eslint-disable prefer-destructuring */
3
3
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
4
 
5
- import * as Def from "effect/Deferred"
6
5
  import * as Effect from "effect/Effect"
7
6
  import * as Option from "effect/Option"
8
7
  import * as Ref from "effect/Ref"
9
- import type { Scope } from "effect/Scope"
10
8
  import type { Semaphore } from "effect/Semaphore"
9
+ import * as Struct from "effect/Struct"
11
10
  import type * as Context from "./Context.ts"
12
11
  import { curry } from "./Function.ts"
13
- import { typedKeysOf } from "./utils.ts"
14
12
 
15
13
  export * from "effect/Effect"
16
14
  // v4: Effect interface not re-exported by `export *` due to local binding collision
@@ -94,9 +92,6 @@ export function ifDiff<I, R, E, A>(n: I, orig: I) {
94
92
  return (f: (i: I) => Effect.Effect<A, E, R>) => ifDiff_(n, orig, f)
95
93
  }
96
94
 
97
- // NOTE: await extension doesnt work via tsplus somehow
98
- export const await_ = Def.await
99
-
100
95
  /**
101
96
  * Ref has atomic modify support if synchronous, for Effect we need a Semaphore.
102
97
  */
@@ -151,9 +146,9 @@ export function allLower<T extends Record<string, Context.Service<any, any> | Ef
151
146
  services: T
152
147
  ) {
153
148
  return Effect.all(
154
- typedKeysOf(services).reduce((prev, cur) => {
149
+ Struct.keys(services).reduce((prev, cur) => {
155
150
  const svc = services[cur]!
156
- prev[((cur as string)[0]!.toLowerCase() + (cur as string).slice(1)) as unknown as LowerFirst<typeof cur>] = svc
151
+ prev[(cur[0]!.toLowerCase() + cur.slice(1)) as unknown as LowerFirst<typeof cur>] = svc
157
152
  return prev
158
153
  }, {} as any),
159
154
  { concurrency: "unbounded" }
@@ -186,17 +181,3 @@ export function catchAllMap<E, A2>(f: (e: E) => A2) {
186
181
  return <R, A>(self: Effect.Effect<A, E, R>): Effect.Effect<A2 | A, never, R> =>
187
182
  Effect.catch(self, (err: E) => Effect.sync(() => f(err)))
188
183
  }
189
-
190
- /**
191
- * Annotates each log in this scope with the specified log annotation.
192
- */
193
- export function annotateLogscoped(key: string, value: string): Effect.Effect<void, never, Scope> {
194
- return Effect.annotateLogsScoped(key, value)
195
- }
196
-
197
- /**
198
- * Annotates each log in this scope with the specified log annotations.
199
- */
200
- export function annotateLogsScoped(kvps: Record<string, string>): Effect.Effect<void, never, Scope> {
201
- return Effect.annotateLogsScoped(kvps)
202
- }
package/src/Function.ts CHANGED
@@ -1,13 +1,6 @@
1
1
  export * from "effect/Function"
2
2
  export type { Predicate, Refinement } from "effect/Predicate"
3
3
 
4
- /**
5
- * Construct tuples
6
- */
7
- export function tuple<T extends ReadonlyArray<any>>(...t: T): Readonly<T> {
8
- return t
9
- }
10
-
11
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
12
5
 
13
6
  export function tupledCurry<A, B, C>(f: (b: B) => (a: A) => C) {
@@ -12,7 +12,6 @@ import type * as Scope from "effect/Scope"
12
12
  import * as Unify from "effect/Unify"
13
13
  import * as Array from "../../../Array.ts"
14
14
  import type { NonEmptyReadonlyArray } from "../../../Array.ts"
15
- import { toNonEmptyArray } from "../../../Array.ts"
16
15
  import * as Chunk from "../../../Chunk.ts"
17
16
  import { NotFoundError } from "../../../client/errors.ts"
18
17
  import * as Context from "../../../Context.ts"
@@ -407,7 +406,7 @@ export function makeRepoInternal<
407
406
  const saveAllE = (a: Iterable<Encoded>) =>
408
407
  flatMapOption(
409
408
  Effect
410
- .sync(() => toNonEmptyArray([...a])),
409
+ .sync(() => Option.liftPredicate(Array.isReadonlyArrayNonEmpty)([...a])),
411
410
  (a) =>
412
411
  Effect.gen(function*() {
413
412
  const { get, set } = yield* cms
@@ -442,7 +441,7 @@ export function makeRepoInternal<
442
441
  })
443
442
  return yield* saveAll(it)
444
443
  .pipe(
445
- Effect.andThen(Effect.sync(() => toNonEmptyArray(evts))),
444
+ Effect.andThen(Effect.sync(() => Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(evts))),
446
445
  // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
447
446
  (_) => flatMapOption(_, pub),
448
447
  Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"] as [T[], "save" | "remove"])),
@@ -473,7 +472,7 @@ export function makeRepoInternal<
473
472
  set(e[idKey], undefined)
474
473
  }
475
474
  yield* Effect
476
- .sync(() => toNonEmptyArray(evts))
475
+ .sync(() => Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(evts))
477
476
  // TODO: for full consistency the events should be stored within the same database transaction, and then picked up.
478
477
  .pipe((_) => flatMapOption(_, pub))
479
478
 
package/src/Model/dsl.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import type { NonEmptyReadonlyArray } from "../Array.ts"
3
- import { toNonEmptyArray } from "../Array.ts"
2
+ import { isReadonlyArrayNonEmpty, type NonEmptyReadonlyArray } from "../Array.ts"
4
3
  import * as Effect from "../Effect.ts"
4
+ import * as Option from "../Option.ts"
5
5
  import { type FixEnv, get, logMany, type Pure, type PureEnvEnv, type PureLogT, set } from "../Pure.ts"
6
6
 
7
7
  export interface PureDSL<S, S2, W> {
@@ -118,12 +118,13 @@ export function makeDSL<S1, S2, Evt>() {
118
118
  export interface DSLExt<S1, S2, Evt> extends ReturnType<typeof makeDSL<S1, S2, Evt>> {}
119
119
 
120
120
  export function ifAny<T, R, E, A>(fn: (items: NonEmptyReadonlyArray<T>) => Effect.Effect<A, E, R>) {
121
- return (items: Iterable<T>) => Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn)
121
+ return (items: Iterable<T>) =>
122
+ Effect.flatMapOption(Effect.sync(() => Option.liftPredicate(isReadonlyArrayNonEmpty)([...items])), fn)
122
123
  }
123
124
 
124
125
  export function ifAny_<T, R, E, A>(
125
126
  items: Iterable<T>,
126
127
  fn: (items: NonEmptyReadonlyArray<T>) => Effect.Effect<A, E, R>
127
128
  ) {
128
- return Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn)
129
+ return Effect.flatMapOption(Effect.sync(() => Option.liftPredicate(isReadonlyArrayNonEmpty)([...items])), fn)
129
130
  }
@@ -2,7 +2,6 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
3
3
  import { identity } from "effect/Function"
4
4
  import * as Array from "../../Array.ts"
5
- import { toNonEmptyArray } from "../../Array.ts"
6
5
  import * as Option from "../../Option.ts"
7
6
  import * as S from "../../Schema.ts"
8
7
  import * as SchemaAST from "../../SchemaAST.ts"
@@ -439,10 +438,10 @@ export const toFilter = <
439
438
  t: null as unknown as TFieldValues,
440
439
  limit: a.limit,
441
440
  skip: a.skip,
442
- select: Option.getOrUndefined(toNonEmptyArray(aggSelect)) as any,
441
+ select: Option.getOrUndefined(Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(aggSelect)) as any,
443
442
  schema: a.schema,
444
443
  computed: undefined,
445
- order: Option.getOrUndefined(toNonEmptyArray(a.order)),
444
+ order: Option.getOrUndefined(Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(a.order)),
446
445
  ttype: a.ttype,
447
446
  mode: "aggregate" as const,
448
447
  filter: a.filter.length ? a.filter : undefined
@@ -519,10 +518,10 @@ export const toFilter = <
519
518
  t: null as unknown as TFieldValues,
520
519
  limit: a.limit,
521
520
  skip: a.skip,
522
- select: Option.getOrUndefined(toNonEmptyArray(select)),
521
+ select: Option.getOrUndefined(Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(select)),
523
522
  schema,
524
523
  computed,
525
- order: Option.getOrUndefined(toNonEmptyArray(a.order)),
524
+ order: Option.getOrUndefined(Option.liftPredicate(Array.isReadonlyArrayNonEmpty)(a.order)),
526
525
  ttype: a.ttype,
527
526
  mode: a.mode ?? "transform",
528
527
  filter: a.filter.length
package/src/Option.ts CHANGED
@@ -4,22 +4,15 @@
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
5
  // eslint-disable-next-line import/no-unassigned-import
6
6
  import "./builtin.ts"
7
- import { getOrUndefined as value, type Some } from "effect/Option"
7
+ import { type Some } from "effect/Option"
8
8
  import * as Option from "effect/Option"
9
9
 
10
10
  export * from "effect/Option"
11
11
 
12
- export const getOrUndefined = value
13
-
14
12
  export function omitableToNullable<T>(om: Option.Option<T> | undefined) {
15
13
  return om ?? Option.fromNullishOr(om)
16
14
  }
17
15
 
18
- export const toBool = Option.match({
19
- onNone: () => false,
20
- onSome: () => true
21
- })
22
-
23
16
  export const fromBool = (b: boolean) => (b ? Option.some(true) : Option.none())
24
17
 
25
18
  /**