@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/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>(printError: Pretty.Pretty<Cause.Cause<E>>, printValue: Pretty.Pretty<A>) =>
39
- (optimistic: AsyncData.Optimistic<E, A>) =>
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(printError, printValue)(optimistic.previous)
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
- never,
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
- never,
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<E, A> = {
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<E, A>
201
+ readonly previous: AsyncDataFrom<A, E>
204
202
  }
205
203
 
206
- const OptimisticFrom = <E, A>(value: A, timestamp: number, previous: AsyncDataFrom<E, A>): OptimisticFrom<E, A> => ({
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 = <E, A>(
214
- causeArb: Arbitrary.Arbitrary<Cause.Cause<E>>,
215
- valueArb: Arbitrary.Arbitrary<A>
216
- ): Arbitrary.Arbitrary<AsyncData.Optimistic<E, A>> =>
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(causeArb, valueArb)(fc).chain((previous) =>
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<E, A> = NoDataFrom | LoadingFrom | FailureFrom<E> | SuccessFrom<A> | OptimisticFrom<E, A>
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<E = unknown, A = unknown>(value: unknown): value is AsyncDataFrom<E, A> {
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 = <R1, EI, E, R2, AI, A>(
339
- error: Schema.Schema<R1, EI, E>,
340
- value: Schema.Schema<R2, AI, A>
341
- ): Schema.Schema<R1 | R2, AsyncDataFrom<EI, AI>, AsyncDataFrom<E, A>> => {
342
- return Schema.declare(
343
- [Schema.cause(error, Schema.unknown), value],
344
- (causeSchema, valueSchema) => {
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
- R1 | R2,
350
+ AsyncDataFrom<A, E>,
353
351
  ParseResult.ParseIssue,
354
- AsyncDataFrom<E, A>
352
+ never
355
353
  > => {
356
354
  return Effect.gen(function*(_) {
357
- if (!isAsyncDataFrom<EI, AI>(input)) {
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
- (causeSchema, valueSchema) => {
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
- R1 | R2,
390
+ AsyncDataFrom<AI, EI>,
393
391
  ParseResult.ParseIssue,
394
- AsyncDataFrom<EI, AI>
392
+ never
395
393
  > => {
396
394
  return Effect.gen(function*(_) {
397
- if (!isAsyncDataFrom<E, A>(input)) {
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: (causeArb, valueArb) => (fc) =>
428
- asyncDataArbitrary(causeArb, valueArb)(fc).map(asyncDataToAsyncDataFrom),
429
- pretty: (causePretty, valuePretty) => (from) =>
430
- asyncDataPretty(causePretty, valuePretty)(asyncDataFromToAsyncData(from))
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 = <R1, EI, E, R2, AI, A>(
439
- errorSchema: Schema.Schema<R1, EI, E>,
440
- valueSchema: Schema.Schema<R2, AI, A>
441
- ): Schema.Schema<R1 | R2, AsyncDataFrom<EI, AI>, AsyncData.AsyncData<E, A>> => {
442
- return asyncDataFromJson(errorSchema, valueSchema)
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
- asyncDataFromSelf(Schema.to(errorSchema), Schema.to(valueSchema)),
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 = <R1, EI, E, R2, AI, A>(
454
- error: Schema.Schema<R1, EI, E>,
455
- value: Schema.Schema<R2, AI, A>
456
- ): Schema.Schema<R1 | R2, AsyncData.AsyncData<EI, AI>, AsyncData.AsyncData<E, A>> => {
457
- return Schema.declare(
458
- [Schema.causeFromSelf(error), value],
459
- (causeSchema, valueSchema) => {
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
- R1 | R2,
470
+ AsyncData.AsyncData<A, E>,
468
471
  ParseResult.ParseIssue,
469
- AsyncData.AsyncData<E, A>
472
+ never
470
473
  > => {
471
474
  return Effect.gen(function*(_) {
472
- if (!AsyncData.isAsyncData<EI, AI>(input)) {
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
- (causeSchema, valueSchema) => {
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
- R1 | R2,
521
+ AsyncData.AsyncData<AI, EI>,
519
522
  ParseResult.ParseIssue,
520
- AsyncData.AsyncData<EI, AI>
523
+ never
521
524
  > => {
522
525
  return Effect.gen(function*(_) {
523
- if (!AsyncData.isAsyncData<E, A>(input)) return yield* _(Effect.fail(ParseResult.forbidden(input)))
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<E, A>(
569
- E: Pretty.Pretty<Cause.Cause<E>>,
570
- A: Pretty.Pretty<A>
571
- ): Pretty.Pretty<AsyncData.AsyncData<E, A>> {
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(E, A)(data)
583
+ Optimistic: (_, data) => OPTIMISTIC_PRETTY(A, E)(data)
578
584
  })
579
585
  }
580
586
 
581
- function asyncDataArbitrary<E, A>(
582
- E: Arbitrary.Arbitrary<Cause.Cause<E>>,
583
- A: Arbitrary.Arbitrary<A>
584
- ): Arbitrary.Arbitrary<AsyncData.AsyncData<E, A>> {
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(E, A)
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<E, A>(data: AsyncData.AsyncData<E, A>): AsyncDataFrom<E, A> {
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<E, A>(data: AsyncDataFrom<E, A>): AsyncData.AsyncData<E, A> {
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<never, never, A> implements Success<A> {
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<never, never, A>
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<E, A> extends Effectable.Class<never, never, A> implements Optimistic<E, A> {
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<never, never, A>
83
+ commit: () => Effect.Effect<A>
84
84
 
85
85
  constructor(
86
86
  readonly value: A,
87
87
  readonly timestamp: number,
88
- readonly previous: AsyncData<E, A>
88
+ readonly previous: AsyncData<A, E>
89
89
  ) {
90
90
  super()
91
91