@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/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>> => {
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), value],
344
- (causeSchema, valueSchema) => {
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
- 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)) {
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
- (causeSchema, valueSchema) => {
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
- 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)) {
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: (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
  )
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 = <R1, EI, E, R2, AI, A>(
441
- errorSchema: Schema.Schema<R1, EI, E>,
442
- valueSchema: Schema.Schema<R2, AI, A>
443
- ): Schema.Schema<R1 | R2, AsyncDataFrom<EI, AI>, AsyncData.AsyncData<E, A>> => {
444
- 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
445
446
  .pipe(Schema.transform(
446
- asyncDataFromSelf(Schema.to(errorSchema), Schema.to(valueSchema)),
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 = <R1, EI, E, R2, AI, A>(
456
- error: Schema.Schema<R1, EI, E>,
457
- value: Schema.Schema<R2, AI, A>
458
- ): Schema.Schema<R1 | R2, AsyncData.AsyncData<EI, AI>, AsyncData.AsyncData<E, A>> => {
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), value],
461
- (causeSchema, valueSchema) => {
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
- R1 | R2,
470
+ AsyncData.AsyncData<A, E>,
470
471
  ParseResult.ParseIssue,
471
- AsyncData.AsyncData<E, A>
472
+ never
472
473
  > => {
473
474
  return Effect.gen(function*(_) {
474
- if (!AsyncData.isAsyncData<EI, AI>(input)) {
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
- (causeSchema, valueSchema) => {
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
- R1 | R2,
521
+ AsyncData.AsyncData<AI, EI>,
521
522
  ParseResult.ParseIssue,
522
- AsyncData.AsyncData<EI, AI>
523
+ never
523
524
  > => {
524
525
  return Effect.gen(function*(_) {
525
- if (!AsyncData.isAsyncData<E, A>(input)) {
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<E, A>(
574
- E: Pretty.Pretty<Cause.Cause<E>>,
575
- A: Pretty.Pretty<A>
576
- ): 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>> {
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(E, A)(data)
583
+ Optimistic: (_, data) => OPTIMISTIC_PRETTY(A, E)(data)
583
584
  })
584
585
  }
585
586
 
586
- function asyncDataArbitrary<E, A>(
587
- E: Arbitrary.Arbitrary<Cause.Cause<E>>,
588
- A: Arbitrary.Arbitrary<A>
589
- ): 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>> {
590
591
  const failureArb = failureArbitrary(E)
591
592
  const successArb = successArbitrary(A)
592
- const optimisticArb = optimisticArbitrary(E, A)
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<E, A>(data: AsyncData.AsyncData<E, A>): AsyncDataFrom<E, A> {
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<E, A>(data: AsyncDataFrom<E, A>): AsyncData.AsyncData<E, A> {
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<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