@typed/async-data 0.5.2 → 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 +27 -17
- 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 +20 -18
- package/dist/esm/Schema.js.map +1 -1
- package/dist/esm/internal/async-data.js.map +1 -1
- package/package.json +3 -3
- package/src/AsyncData.ts +63 -63
- package/src/Progress.ts +4 -9
- package/src/Schema.ts +69 -68
- 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<
|
|
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> => {
|
|
342
340
|
const schema = Schema.declare(
|
|
343
|
-
[Schema.cause(error, Schema.unknown)
|
|
344
|
-
(
|
|
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,12 +347,12 @@ 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<
|
|
355
|
+
if (!isAsyncDataFrom<AI, EI>(input)) {
|
|
358
356
|
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
359
357
|
}
|
|
360
358
|
|
|
@@ -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,12 +387,12 @@ 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<
|
|
395
|
+
if (!isAsyncDataFrom<A, E>(input)) {
|
|
398
396
|
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
399
397
|
}
|
|
400
398
|
|
|
@@ -424,10 +422,10 @@ 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
|
)
|
|
433
431
|
|
|
@@ -437,13 +435,16 @@ export const asyncDataFromJson = <R1, EI, E, R2, AI, A>(
|
|
|
437
435
|
/**
|
|
438
436
|
* @since 1.0.0
|
|
439
437
|
*/
|
|
440
|
-
export const asyncData = <
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
): Schema.Schema<
|
|
444
|
-
|
|
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
|
|
445
446
|
.pipe(Schema.transform(
|
|
446
|
-
|
|
447
|
+
to,
|
|
447
448
|
asyncDataFromToAsyncData,
|
|
448
449
|
asyncDataToAsyncDataFrom
|
|
449
450
|
))
|
|
@@ -452,13 +453,13 @@ export const asyncData = <R1, EI, E, R2, AI, A>(
|
|
|
452
453
|
/**
|
|
453
454
|
* @since 1.0.0
|
|
454
455
|
*/
|
|
455
|
-
export const asyncDataFromSelf = <
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
): Schema.Schema<
|
|
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> => {
|
|
459
460
|
const schema = Schema.declare(
|
|
460
|
-
[Schema.causeFromSelf(error)
|
|
461
|
-
(
|
|
461
|
+
[value, Schema.causeFromSelf({ error })],
|
|
462
|
+
(valueSchema, causeSchema) => {
|
|
462
463
|
const parseCause = Parser.decode(causeSchema)
|
|
463
464
|
const parseValue = Parser.decode(valueSchema)
|
|
464
465
|
|
|
@@ -466,12 +467,12 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
466
467
|
input: unknown,
|
|
467
468
|
options?: AST.ParseOptions
|
|
468
469
|
): Effect.Effect<
|
|
469
|
-
|
|
470
|
+
AsyncData.AsyncData<A, E>,
|
|
470
471
|
ParseResult.ParseIssue,
|
|
471
|
-
|
|
472
|
+
never
|
|
472
473
|
> => {
|
|
473
474
|
return Effect.gen(function*(_) {
|
|
474
|
-
if (!AsyncData.isAsyncData<
|
|
475
|
+
if (!AsyncData.isAsyncData<AI, EI>(input)) {
|
|
475
476
|
return yield* _(Effect.fail<ParseResult.ParseIssue>(ParseResult.forbidden(schema.ast, input)))
|
|
476
477
|
}
|
|
477
478
|
|
|
@@ -509,7 +510,7 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
509
510
|
|
|
510
511
|
return parseAsyncData
|
|
511
512
|
},
|
|
512
|
-
(
|
|
513
|
+
(valueSchema, causeSchema) => {
|
|
513
514
|
const parseCause = Parser.encode(causeSchema)
|
|
514
515
|
const parseValue = Parser.encode(valueSchema)
|
|
515
516
|
|
|
@@ -517,12 +518,12 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
517
518
|
input: unknown,
|
|
518
519
|
options?: AST.ParseOptions
|
|
519
520
|
): Effect.Effect<
|
|
520
|
-
|
|
521
|
+
AsyncData.AsyncData<AI, EI>,
|
|
521
522
|
ParseResult.ParseIssue,
|
|
522
|
-
|
|
523
|
+
never
|
|
523
524
|
> => {
|
|
524
525
|
return Effect.gen(function*(_) {
|
|
525
|
-
if (!AsyncData.isAsyncData<
|
|
526
|
+
if (!AsyncData.isAsyncData<A, E>(input)) {
|
|
526
527
|
return yield* _(Effect.fail(ParseResult.forbidden(schema.ast, input)))
|
|
527
528
|
}
|
|
528
529
|
|
|
@@ -570,26 +571,26 @@ export const asyncDataFromSelf = <R1, EI, E, R2, AI, A>(
|
|
|
570
571
|
return schema
|
|
571
572
|
}
|
|
572
573
|
|
|
573
|
-
function asyncDataPretty<
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
): 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>> {
|
|
577
578
|
return AsyncData.match({
|
|
578
579
|
NoData: () => NO_DATA_PRETTY,
|
|
579
580
|
Loading: LOADING_PRETTY,
|
|
580
581
|
Failure: (_, data) => FAILURE_PRETTY(E)(data),
|
|
581
582
|
Success: (_, data) => SUCCESS_PRETTY(A)(data),
|
|
582
|
-
Optimistic: (_, data) => OPTIMISTIC_PRETTY(
|
|
583
|
+
Optimistic: (_, data) => OPTIMISTIC_PRETTY(A, E)(data)
|
|
583
584
|
})
|
|
584
585
|
}
|
|
585
586
|
|
|
586
|
-
function asyncDataArbitrary<
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
): 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>> {
|
|
590
591
|
const failureArb = failureArbitrary(E)
|
|
591
592
|
const successArb = successArbitrary(A)
|
|
592
|
-
const optimisticArb = optimisticArbitrary(
|
|
593
|
+
const optimisticArb = optimisticArbitrary(A, E)
|
|
593
594
|
|
|
594
595
|
return (fc) =>
|
|
595
596
|
fc.oneof(
|
|
@@ -693,7 +694,7 @@ function fiberIdToFiberIdFrom(id: FiberId.FiberId): Schema.FiberIdFrom {
|
|
|
693
694
|
|
|
694
695
|
const NO_DATA_FROM: NoDataFrom = { _tag: "NoData" } as const
|
|
695
696
|
|
|
696
|
-
function asyncDataToAsyncDataFrom<
|
|
697
|
+
function asyncDataToAsyncDataFrom<A, E>(data: AsyncData.AsyncData<A, E>): AsyncDataFrom<A, E> {
|
|
697
698
|
switch (data._tag) {
|
|
698
699
|
case "NoData":
|
|
699
700
|
return NO_DATA_FROM
|
|
@@ -716,7 +717,7 @@ function asyncDataToAsyncDataFrom<E, A>(data: AsyncData.AsyncData<E, A>): AsyncD
|
|
|
716
717
|
}
|
|
717
718
|
}
|
|
718
719
|
|
|
719
|
-
function asyncDataFromToAsyncData<
|
|
720
|
+
function asyncDataFromToAsyncData<A, E>(data: AsyncDataFrom<A, E>): AsyncData.AsyncData<A, E> {
|
|
720
721
|
switch (data._tag) {
|
|
721
722
|
case "NoData":
|
|
722
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
|
|