@typed/async-data 0.5.1 → 0.6.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.
- package/dist/cjs/AsyncData.js.map +1 -1
- package/dist/cjs/Progress.js.map +1 -1
- package/dist/cjs/Schema.js +35 -21
- package/dist/cjs/Schema.js.map +1 -1
- package/dist/cjs/internal/async-data.js.map +1 -1
- package/dist/dts/AsyncData.d.ts +43 -44
- package/dist/dts/AsyncData.d.ts.map +1 -1
- package/dist/dts/Progress.d.ts +1 -3
- package/dist/dts/Progress.d.ts.map +1 -1
- package/dist/dts/Schema.d.ts +8 -8
- package/dist/dts/Schema.d.ts.map +1 -1
- package/dist/dts/internal/async-data.d.ts +6 -6
- package/dist/dts/internal/async-data.d.ts.map +1 -1
- package/dist/esm/AsyncData.js.map +1 -1
- package/dist/esm/Progress.js.map +1 -1
- package/dist/esm/Schema.js +28 -23
- package/dist/esm/Schema.js.map +1 -1
- package/dist/esm/internal/async-data.js.map +1 -1
- package/package.json +4 -4
- package/src/AsyncData.ts +63 -63
- package/src/Progress.ts +4 -9
- package/src/Schema.ts +79 -73
- package/src/internal/async-data.ts +5 -5
package/src/Schema.ts
CHANGED
|
@@ -35,10 +35,10 @@ const SUCCESS_PRETTY = <A>(print: Pretty.Pretty<A>) => (success: AsyncData.Succe
|
|
|
35
35
|
})
|
|
36
36
|
|
|
37
37
|
const OPTIMISTIC_PRETTY =
|
|
38
|
-
<E, A>(
|
|
39
|
-
(optimistic: AsyncData.Optimistic<
|
|
38
|
+
<E, A>(printValue: Pretty.Pretty<A>, printError: Pretty.Pretty<Cause.Cause<E>>) =>
|
|
39
|
+
(optimistic: AsyncData.Optimistic<A, E>) =>
|
|
40
40
|
`AsyncData.Optimistic(timestamp=${optimistic.timestamp}, value=${printValue(optimistic.value)}, previous=${
|
|
41
|
-
asyncDataPretty(
|
|
41
|
+
asyncDataPretty(printValue, printError)(optimistic.previous)
|
|
42
42
|
})`
|
|
43
43
|
|
|
44
44
|
/**
|
|
@@ -52,12 +52,11 @@ const ProgressSchemaJson = Schema.struct({
|
|
|
52
52
|
})
|
|
53
53
|
|
|
54
54
|
const ProgressSchema: Schema.Schema<
|
|
55
|
-
|
|
55
|
+
P.Progress,
|
|
56
56
|
{
|
|
57
57
|
readonly loaded: bigint
|
|
58
58
|
readonly total: Option.Option<bigint>
|
|
59
|
-
}
|
|
60
|
-
P.Progress
|
|
59
|
+
}
|
|
61
60
|
> = Schema.data(Schema.struct({
|
|
62
61
|
loaded: Schema.bigintFromSelf,
|
|
63
62
|
total: Schema.optionFromSelf(Schema.bigintFromSelf)
|
|
@@ -70,9 +69,8 @@ const progressArbitrary: Arbitrary.Arbitrary<P.Progress> = (fc) =>
|
|
|
70
69
|
* @since 1.0.0
|
|
71
70
|
*/
|
|
72
71
|
export const Progress: Schema.Schema<
|
|
73
|
-
|
|
74
|
-
{ readonly loaded: string; readonly total?: string | undefined }
|
|
75
|
-
P.Progress
|
|
72
|
+
P.Progress,
|
|
73
|
+
{ readonly loaded: string; readonly total?: string | undefined }
|
|
76
74
|
> = ProgressSchemaJson.pipe(
|
|
77
75
|
Schema.transform(
|
|
78
76
|
ProgressSchema,
|
|
@@ -196,26 +194,26 @@ const SuccessFrom = <A>(value: A, timestamp: number, refreshing?: LoadingFrom):
|
|
|
196
194
|
/**
|
|
197
195
|
* @since 1.0.0
|
|
198
196
|
*/
|
|
199
|
-
export type OptimisticFrom<
|
|
197
|
+
export type OptimisticFrom<A, E> = {
|
|
200
198
|
readonly timestamp: number
|
|
201
199
|
readonly _tag: "Optimistic"
|
|
202
200
|
readonly value: A
|
|
203
|
-
readonly previous: AsyncDataFrom<
|
|
201
|
+
readonly previous: AsyncDataFrom<A, E>
|
|
204
202
|
}
|
|
205
203
|
|
|
206
|
-
const OptimisticFrom = <
|
|
204
|
+
const OptimisticFrom = <A, E>(value: A, timestamp: number, previous: AsyncDataFrom<A, E>): OptimisticFrom<A, E> => ({
|
|
207
205
|
_tag: "Optimistic",
|
|
208
206
|
value,
|
|
209
207
|
timestamp,
|
|
210
208
|
previous
|
|
211
209
|
})
|
|
212
210
|
|
|
213
|
-
const optimisticArbitrary = <
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
): Arbitrary.Arbitrary<AsyncData.Optimistic<
|
|
211
|
+
const optimisticArbitrary = <A, E>(
|
|
212
|
+
valueArb: Arbitrary.Arbitrary<A>,
|
|
213
|
+
causeArb: Arbitrary.Arbitrary<Cause.Cause<E>>
|
|
214
|
+
): Arbitrary.Arbitrary<AsyncData.Optimistic<A, E>> =>
|
|
217
215
|
(fc) =>
|
|
218
|
-
asyncDataArbitrary(
|
|
216
|
+
asyncDataArbitrary(valueArb, causeArb)(fc).chain((previous) =>
|
|
219
217
|
valueArb(fc).chain((value) =>
|
|
220
218
|
fc.date().map((date) => AsyncData.optimistic(previous, value, { timestamp: date.getTime() }))
|
|
221
219
|
)
|
|
@@ -224,7 +222,7 @@ const optimisticArbitrary = <E, A>(
|
|
|
224
222
|
/**
|
|
225
223
|
* @since 1.0.0
|
|
226
224
|
*/
|
|
227
|
-
export type AsyncDataFrom<
|
|
225
|
+
export type AsyncDataFrom<A, E> = NoDataFrom | LoadingFrom | FailureFrom<E> | SuccessFrom<A> | OptimisticFrom<A, E>
|
|
228
226
|
|
|
229
227
|
const fromEq = (a: AsyncDataFrom<any, any>, b: AsyncDataFrom<any, any>): boolean => {
|
|
230
228
|
if (a._tag !== b._tag) return false
|
|
@@ -293,7 +291,7 @@ function isLoadingFrom(value: unknown): value is LoadingFrom {
|
|
|
293
291
|
&& (hasProperty(value, "progress") ? isProgressFrom(value.progress) : true)
|
|
294
292
|
}
|
|
295
293
|
|
|
296
|
-
const isCauseFrom = Schema.is(Schema.from(Schema.cause(Schema.unknown)))
|
|
294
|
+
const isCauseFrom = Schema.is(Schema.from(Schema.cause({ defect: Schema.unknown, error: Schema.unknown })))
|
|
297
295
|
|
|
298
296
|
function isFailureFrom(value: unknown): value is FailureFrom<any> {
|
|
299
297
|
return hasProperty(value, "_tag")
|
|
@@ -324,7 +322,7 @@ function isOptimisticFrom(value: unknown): value is OptimisticFrom<any, any> {
|
|
|
324
322
|
&& typeof value.timestamp === "number"
|
|
325
323
|
}
|
|
326
324
|
|
|
327
|
-
function isAsyncDataFrom<
|
|
325
|
+
function isAsyncDataFrom<A = unknown, E = unknown>(value: unknown): value is AsyncDataFrom<A, E> {
|
|
328
326
|
return isNoDataFrom(value)
|
|
329
327
|
|| isLoadingFrom(value)
|
|
330
328
|
|| isFailureFrom(value)
|
|
@@ -335,13 +333,13 @@ function isAsyncDataFrom<E = unknown, A = unknown>(value: unknown): value is Asy
|
|
|
335
333
|
/**
|
|
336
334
|
* @since 1.0.0
|
|
337
335
|
*/
|
|
338
|
-
export const asyncDataFromJson = <
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
): Schema.Schema<
|
|
342
|
-
|
|
343
|
-
[Schema.cause(error, Schema.unknown)
|
|
344
|
-
(
|
|
336
|
+
export const asyncDataFromJson = <A, AI, R1, E, EI, R2>(
|
|
337
|
+
value: Schema.Schema<A, AI, R1>,
|
|
338
|
+
error: Schema.Schema<E, EI, R2>
|
|
339
|
+
): Schema.Schema<AsyncDataFrom<A, E>, AsyncDataFrom<AI, EI>, R1 | R2> => {
|
|
340
|
+
const schema = Schema.declare(
|
|
341
|
+
[value, Schema.cause({ error, defect: Schema.unknown })],
|
|
342
|
+
(valueSchema, causeSchema) => {
|
|
345
343
|
const parseCause = Parser.decode(causeSchema)
|
|
346
344
|
const parseValue = Parser.decode(valueSchema)
|
|
347
345
|
|
|
@@ -349,13 +347,13 @@ export const asyncDataFromJson = <R1, EI, E, R2, AI, A>(
|
|
|
349
347
|
input: unknown,
|
|
350
348
|
options?: AST.ParseOptions | undefined
|
|
351
349
|
): Effect.Effect<
|
|
352
|
-
|
|
350
|
+
AsyncDataFrom<A, E>,
|
|
353
351
|
ParseResult.ParseIssue,
|
|
354
|
-
|
|
352
|
+
never
|
|
355
353
|
> => {
|
|
356
354
|
return Effect.gen(function*(_) {
|
|
357
|
-
if (!isAsyncDataFrom<
|
|
358
|
-
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(input)))
|
|
355
|
+
if (!isAsyncDataFrom<AI, EI>(input)) {
|
|
356
|
+
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
359
357
|
}
|
|
360
358
|
|
|
361
359
|
switch (input._tag) {
|
|
@@ -381,7 +379,7 @@ export const asyncDataFromJson = <R1, EI, E, R2, AI, A>(
|
|
|
381
379
|
|
|
382
380
|
return parseAsyncData
|
|
383
381
|
},
|
|
384
|
-
(
|
|
382
|
+
(valueSchema, causeSchema) => {
|
|
385
383
|
const parseCause = Parser.encode(causeSchema)
|
|
386
384
|
const parseValue = Parser.encode(valueSchema)
|
|
387
385
|
|
|
@@ -389,13 +387,13 @@ export const asyncDataFromJson = <R1, EI, E, R2, AI, A>(
|
|
|
389
387
|
input: unknown,
|
|
390
388
|
options?: AST.ParseOptions
|
|
391
389
|
): Effect.Effect<
|
|
392
|
-
|
|
390
|
+
AsyncDataFrom<AI, EI>,
|
|
393
391
|
ParseResult.ParseIssue,
|
|
394
|
-
|
|
392
|
+
never
|
|
395
393
|
> => {
|
|
396
394
|
return Effect.gen(function*(_) {
|
|
397
|
-
if (!isAsyncDataFrom<
|
|
398
|
-
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(input)))
|
|
395
|
+
if (!isAsyncDataFrom<A, E>(input)) {
|
|
396
|
+
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
399
397
|
}
|
|
400
398
|
|
|
401
399
|
switch (input._tag) {
|
|
@@ -424,24 +422,29 @@ export const asyncDataFromJson = <R1, EI, E, R2, AI, A>(
|
|
|
424
422
|
{
|
|
425
423
|
title: "AsyncDataFrom",
|
|
426
424
|
equivalence: () => fromEq,
|
|
427
|
-
arbitrary: (
|
|
428
|
-
asyncDataArbitrary(
|
|
429
|
-
pretty: (
|
|
430
|
-
asyncDataPretty(
|
|
425
|
+
arbitrary: (valueArb, causeArb) => (fc) =>
|
|
426
|
+
asyncDataArbitrary(valueArb, causeArb)(fc).map(asyncDataToAsyncDataFrom),
|
|
427
|
+
pretty: (valuePretty, causePretty) => (from) =>
|
|
428
|
+
asyncDataPretty(valuePretty, causePretty)(asyncDataFromToAsyncData(from))
|
|
431
429
|
}
|
|
432
430
|
)
|
|
431
|
+
|
|
432
|
+
return schema
|
|
433
433
|
}
|
|
434
434
|
|
|
435
435
|
/**
|
|
436
436
|
* @since 1.0.0
|
|
437
437
|
*/
|
|
438
|
-
export const asyncData = <
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
): Schema.Schema<
|
|
442
|
-
|
|
438
|
+
export const asyncData = <A, AI, R1, E, EI, R2>(
|
|
439
|
+
valueSchema: Schema.Schema<A, AI, R2>,
|
|
440
|
+
errorSchema: Schema.Schema<E, EI, R1>
|
|
441
|
+
): Schema.Schema<AsyncData.AsyncData<A, E>, AsyncDataFrom<AI, EI>, R1 | R2> => {
|
|
442
|
+
const from = asyncDataFromJson(valueSchema, errorSchema)
|
|
443
|
+
const to = asyncDataFromSelf(Schema.to(valueSchema), Schema.to(errorSchema))
|
|
444
|
+
|
|
445
|
+
return from
|
|
443
446
|
.pipe(Schema.transform(
|
|
444
|
-
|
|
447
|
+
to,
|
|
445
448
|
asyncDataFromToAsyncData,
|
|
446
449
|
asyncDataToAsyncDataFrom
|
|
447
450
|
))
|
|
@@ -450,13 +453,13 @@ export const asyncData = <R1, EI, E, R2, AI, A>(
|
|
|
450
453
|
/**
|
|
451
454
|
* @since 1.0.0
|
|
452
455
|
*/
|
|
453
|
-
export const asyncDataFromSelf = <
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
): Schema.Schema<
|
|
457
|
-
|
|
458
|
-
[Schema.causeFromSelf(error)
|
|
459
|
-
(
|
|
456
|
+
export const asyncDataFromSelf = <A, AI, R1, E, EI, R2>(
|
|
457
|
+
value: Schema.Schema<A, AI, R2>,
|
|
458
|
+
error: Schema.Schema<E, EI, R1>
|
|
459
|
+
): Schema.Schema<AsyncData.AsyncData<A, E>, AsyncData.AsyncData<AI, EI>, R1 | R2> => {
|
|
460
|
+
const schema = Schema.declare(
|
|
461
|
+
[value, Schema.causeFromSelf({ error })],
|
|
462
|
+
(valueSchema, causeSchema) => {
|
|
460
463
|
const parseCause = Parser.decode(causeSchema)
|
|
461
464
|
const parseValue = Parser.decode(valueSchema)
|
|
462
465
|
|
|
@@ -464,13 +467,13 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
464
467
|
input: unknown,
|
|
465
468
|
options?: AST.ParseOptions
|
|
466
469
|
): Effect.Effect<
|
|
467
|
-
|
|
470
|
+
AsyncData.AsyncData<A, E>,
|
|
468
471
|
ParseResult.ParseIssue,
|
|
469
|
-
|
|
472
|
+
never
|
|
470
473
|
> => {
|
|
471
474
|
return Effect.gen(function*(_) {
|
|
472
|
-
if (!AsyncData.isAsyncData<
|
|
473
|
-
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(input)))
|
|
475
|
+
if (!AsyncData.isAsyncData<AI, EI>(input)) {
|
|
476
|
+
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
474
477
|
}
|
|
475
478
|
|
|
476
479
|
switch (input._tag) {
|
|
@@ -507,7 +510,7 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
507
510
|
|
|
508
511
|
return parseAsyncData
|
|
509
512
|
},
|
|
510
|
-
(
|
|
513
|
+
(valueSchema, causeSchema) => {
|
|
511
514
|
const parseCause = Parser.encode(causeSchema)
|
|
512
515
|
const parseValue = Parser.encode(valueSchema)
|
|
513
516
|
|
|
@@ -515,12 +518,14 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
515
518
|
input: unknown,
|
|
516
519
|
options?: AST.ParseOptions
|
|
517
520
|
): Effect.Effect<
|
|
518
|
-
|
|
521
|
+
AsyncData.AsyncData<AI, EI>,
|
|
519
522
|
ParseResult.ParseIssue,
|
|
520
|
-
|
|
523
|
+
never
|
|
521
524
|
> => {
|
|
522
525
|
return Effect.gen(function*(_) {
|
|
523
|
-
if (!AsyncData.isAsyncData<
|
|
526
|
+
if (!AsyncData.isAsyncData<A, E>(input)) {
|
|
527
|
+
return yield* _(Effect.fail(ParseResult.forbidden(schema.ast, input)))
|
|
528
|
+
}
|
|
524
529
|
|
|
525
530
|
switch (input._tag) {
|
|
526
531
|
case "NoData":
|
|
@@ -563,28 +568,29 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
563
568
|
equivalence: () => Equal.equals
|
|
564
569
|
}
|
|
565
570
|
)
|
|
571
|
+
return schema
|
|
566
572
|
}
|
|
567
573
|
|
|
568
|
-
function asyncDataPretty<
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
): Pretty.Pretty<AsyncData.AsyncData<
|
|
574
|
+
function asyncDataPretty<A, E>(
|
|
575
|
+
A: Pretty.Pretty<A>,
|
|
576
|
+
E: Pretty.Pretty<Cause.Cause<E>>
|
|
577
|
+
): Pretty.Pretty<AsyncData.AsyncData<A, E>> {
|
|
572
578
|
return AsyncData.match({
|
|
573
579
|
NoData: () => NO_DATA_PRETTY,
|
|
574
580
|
Loading: LOADING_PRETTY,
|
|
575
581
|
Failure: (_, data) => FAILURE_PRETTY(E)(data),
|
|
576
582
|
Success: (_, data) => SUCCESS_PRETTY(A)(data),
|
|
577
|
-
Optimistic: (_, data) => OPTIMISTIC_PRETTY(
|
|
583
|
+
Optimistic: (_, data) => OPTIMISTIC_PRETTY(A, E)(data)
|
|
578
584
|
})
|
|
579
585
|
}
|
|
580
586
|
|
|
581
|
-
function asyncDataArbitrary<
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
): Arbitrary.Arbitrary<AsyncData.AsyncData<
|
|
587
|
+
function asyncDataArbitrary<A, E>(
|
|
588
|
+
A: Arbitrary.Arbitrary<A>,
|
|
589
|
+
E: Arbitrary.Arbitrary<Cause.Cause<E>>
|
|
590
|
+
): Arbitrary.Arbitrary<AsyncData.AsyncData<A, E>> {
|
|
585
591
|
const failureArb = failureArbitrary(E)
|
|
586
592
|
const successArb = successArbitrary(A)
|
|
587
|
-
const optimisticArb = optimisticArbitrary(
|
|
593
|
+
const optimisticArb = optimisticArbitrary(A, E)
|
|
588
594
|
|
|
589
595
|
return (fc) =>
|
|
590
596
|
fc.oneof(
|
|
@@ -688,7 +694,7 @@ function fiberIdToFiberIdFrom(id: FiberId.FiberId): Schema.FiberIdFrom {
|
|
|
688
694
|
|
|
689
695
|
const NO_DATA_FROM: NoDataFrom = { _tag: "NoData" } as const
|
|
690
696
|
|
|
691
|
-
function asyncDataToAsyncDataFrom<
|
|
697
|
+
function asyncDataToAsyncDataFrom<A, E>(data: AsyncData.AsyncData<A, E>): AsyncDataFrom<A, E> {
|
|
692
698
|
switch (data._tag) {
|
|
693
699
|
case "NoData":
|
|
694
700
|
return NO_DATA_FROM
|
|
@@ -711,7 +717,7 @@ function asyncDataToAsyncDataFrom<E, A>(data: AsyncData.AsyncData<E, A>): AsyncD
|
|
|
711
717
|
}
|
|
712
718
|
}
|
|
713
719
|
|
|
714
|
-
function asyncDataFromToAsyncData<
|
|
720
|
+
function asyncDataFromToAsyncData<A, E>(data: AsyncDataFrom<A, E>): AsyncData.AsyncData<A, E> {
|
|
715
721
|
switch (data._tag) {
|
|
716
722
|
case "NoData":
|
|
717
723
|
return AsyncData.noData()
|
|
@@ -46,11 +46,11 @@ export class FailureImpl<E> extends Effectable.Class<never, E, never> implements
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// @ts-expect-error
|
|
49
|
-
export class SuccessImpl<A> extends Effectable.Class<
|
|
49
|
+
export class SuccessImpl<A> extends Effectable.Class<A> implements Success<A> {
|
|
50
50
|
readonly [AsyncDataTypeId]: AsyncDataTypeId = AsyncDataTypeId
|
|
51
51
|
readonly _tag = SUCCESS_TAG
|
|
52
52
|
|
|
53
|
-
commit: () => Effect.Effect<
|
|
53
|
+
commit: () => Effect.Effect<A>
|
|
54
54
|
|
|
55
55
|
constructor(readonly value: A, readonly timestamp: number, readonly refreshing: Option.Option<Loading>) {
|
|
56
56
|
super()
|
|
@@ -76,16 +76,16 @@ export class SuccessImpl<A> extends Effectable.Class<never, never, A> implements
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
// @ts-expect-error
|
|
79
|
-
export class OptimisticImpl<
|
|
79
|
+
export class OptimisticImpl<A, E> extends Effectable.Class<A> implements Optimistic<A, E> {
|
|
80
80
|
readonly [AsyncDataTypeId]: AsyncDataTypeId = AsyncDataTypeId
|
|
81
81
|
readonly _tag = OPTIMISTIC_TAG
|
|
82
82
|
|
|
83
|
-
commit: () => Effect.Effect<
|
|
83
|
+
commit: () => Effect.Effect<A>
|
|
84
84
|
|
|
85
85
|
constructor(
|
|
86
86
|
readonly value: A,
|
|
87
87
|
readonly timestamp: number,
|
|
88
|
-
readonly previous: AsyncData<
|
|
88
|
+
readonly previous: AsyncData<A, E>
|
|
89
89
|
) {
|
|
90
90
|
super()
|
|
91
91
|
|