@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/AsyncData.ts CHANGED
@@ -29,7 +29,7 @@ const getCurrentTimestamp = () => Date.now()
29
29
  *
30
30
  * @since 1.0.0
31
31
  */
32
- export type AsyncData<E, A> = NoData | Loading | Failure<E> | Success<A> | Optimistic<E, A>
32
+ export type AsyncData<A, E = never> = NoData | Loading | Failure<E> | Success<A> | Optimistic<A, E>
33
33
 
34
34
  /**
35
35
  * @since 1.0.0
@@ -38,12 +38,12 @@ export namespace AsyncData {
38
38
  /**
39
39
  * @since 1.0.0
40
40
  */
41
- export type Error<T> = [T] extends [AsyncData<infer E, infer _>] ? E : never
41
+ export type Error<T> = [T] extends [AsyncData<infer _, infer E>] ? E : never
42
42
 
43
43
  /**
44
44
  * @since 1.0.0
45
45
  */
46
- export type Success<T> = [T] extends [AsyncData<infer _, infer A>] ? A : never
46
+ export type Success<T> = [T] extends [AsyncData<infer A, infer _>] ? A : never
47
47
 
48
48
  /**
49
49
  * @category models
@@ -98,7 +98,7 @@ export class NoData extends Data.TaggedError(NO_DATA_TAG)<{}> {
98
98
  */
99
99
  export const noData: {
100
100
  (): NoData
101
- <E, A>(): AsyncData<E, A>
101
+ <A, E>(): AsyncData<A, E>
102
102
  } = (): NoData => new NoData()
103
103
 
104
104
  /**
@@ -146,7 +146,7 @@ export type OptionalPartial<A> = [
146
146
  */
147
147
  export const loading: {
148
148
  (options?: OptionalPartial<LoadingOptions>): Loading
149
- <E, A>(options?: OptionalPartial<LoadingOptions>): AsyncData<E, A>
149
+ <A, E>(options?: OptionalPartial<LoadingOptions>): AsyncData<A, E>
150
150
  } = (options?: OptionalPartial<LoadingOptions>): Loading =>
151
151
  new Loading({
152
152
  [AsyncDataTypeId]: AsyncDataTypeId,
@@ -209,7 +209,7 @@ export type FailureOptions = {
209
209
  */
210
210
  export const failCause: {
211
211
  <E>(cause: Cause.Cause<E>, options?: OptionalPartial<FailureOptions>): Failure<E>
212
- <E, A>(cause: Cause.Cause<E>, options?: OptionalPartial<FailureOptions>): AsyncData<E, A>
212
+ <A, E>(cause: Cause.Cause<E>, options?: OptionalPartial<FailureOptions>): AsyncData<A, E>
213
213
  } = <E>(cause: Cause.Cause<E>, options?: OptionalPartial<FailureOptions>): Failure<E> =>
214
214
  new internal.FailureImpl(
215
215
  cause,
@@ -222,7 +222,7 @@ export const failCause: {
222
222
  */
223
223
  export const fail: {
224
224
  <E>(error: E, options?: OptionalPartial<FailureOptions>): Failure<E>
225
- <E, A>(error: E, options?: OptionalPartial<FailureOptions>): AsyncData<E, A>
225
+ <A, E>(error: E, options?: OptionalPartial<FailureOptions>): AsyncData<A, E>
226
226
  } = <E>(error: E, options?: OptionalPartial<FailureOptions>): Failure<E> => failCause<E>(Cause.fail(error), options)
227
227
 
228
228
  /**
@@ -257,7 +257,7 @@ export type SuccessOptions = {
257
257
  */
258
258
  export const success: {
259
259
  <A>(value: A, options?: OptionalPartial<SuccessOptions>): Success<A>
260
- <E, A>(value: A, options?: OptionalPartial<SuccessOptions>): AsyncData<E, A>
260
+ <A, E>(value: A, options?: OptionalPartial<SuccessOptions>): AsyncData<A, E>
261
261
  } = <A>(value: A, options?: OptionalPartial<SuccessOptions>): Success<A> =>
262
262
  new internal.SuccessImpl(
263
263
  value,
@@ -268,12 +268,12 @@ export const success: {
268
268
  /**
269
269
  * @since 1.0.0
270
270
  */
271
- export interface Optimistic<E, A> extends Effect.Effect<never, never, A> {
271
+ export interface Optimistic<A, E = never> extends Effect.Effect<never, never, A> {
272
272
  readonly [AsyncDataTypeId]: AsyncDataTypeId
273
273
  readonly _tag: "Optimistic"
274
274
  readonly value: A
275
275
  readonly timestamp: number // Date.now()
276
- readonly previous: AsyncData<E, A>
276
+ readonly previous: AsyncData<A, E>
277
277
 
278
278
  readonly [Unify.typeSymbol]: unknown
279
279
  readonly [Unify.unifySymbol]: AsyncData.Unify<this>
@@ -293,12 +293,12 @@ const isAsyncDataFirst = (args: IArguments) => isAsyncData(args[0])
293
293
  * @since 1.0.0
294
294
  */
295
295
  export const optimistic: {
296
- <A>(value: A, options?: OptionalPartial<OptimisticOptions>): <E>(previous: AsyncData<E, A>) => Optimistic<E, A>
297
- <E, A>(previous: AsyncData<E, A>, value: A, options?: OptionalPartial<OptimisticOptions>): Optimistic<E, A>
296
+ <A>(value: A, options?: OptionalPartial<OptimisticOptions>): <E>(previous: AsyncData<A, E>) => Optimistic<A, E>
297
+ <A, E = never>(previous: AsyncData<A, E>, value: A, options?: OptionalPartial<OptimisticOptions>): Optimistic<A, E>
298
298
  } = dual(
299
299
  (args) => args.length === 3 || isAsyncDataFirst(args),
300
- <E, A>(previous: AsyncData<E, A>, value: A, options?: OptionalPartial<OptimisticOptions>): Optimistic<E, A> =>
301
- new internal.OptimisticImpl(
300
+ <A, E>(previous: AsyncData<A, E>, value: A, options?: OptionalPartial<OptimisticOptions>): Optimistic<A, E> =>
301
+ new internal.OptimisticImpl<A, E>(
302
302
  value,
303
303
  options?.timestamp ?? getCurrentTimestamp(),
304
304
  // We don't want to nest Optimistic values, so we unwrap the previous value if it's already optimistic
@@ -309,32 +309,32 @@ export const optimistic: {
309
309
  /**
310
310
  * @since 1.0.0
311
311
  */
312
- export const isSuccess = <E, A>(data: AsyncData<E, A>): data is Success<A> => data._tag === SUCCESS_TAG
312
+ export const isSuccess = <A, E>(data: AsyncData<A, E>): data is Success<A> => data._tag === SUCCESS_TAG
313
313
 
314
314
  /**
315
315
  * @since 1.0.0
316
316
  */
317
- export const isOptimistic = <E, A>(data: AsyncData<E, A>): data is Optimistic<E, A> => data._tag === OPTIMISTIC_TAG
317
+ export const isOptimistic = <A, E>(data: AsyncData<A, E>): data is Optimistic<A, E> => data._tag === OPTIMISTIC_TAG
318
318
 
319
319
  /**
320
320
  * @since 1.0.0
321
321
  */
322
- export const isFailure = <E, A>(data: AsyncData<E, A>): data is Failure<E> => data._tag === FAILURE_TAG
322
+ export const isFailure = <A, E>(data: AsyncData<A, E>): data is Failure<E> => data._tag === FAILURE_TAG
323
323
 
324
324
  /**
325
325
  * @since 1.0.0
326
326
  */
327
- export const isLoading = <E, A>(data: AsyncData<E, A>): data is Loading => data._tag === LOADING_TAG
327
+ export const isLoading = <A, E>(data: AsyncData<A, E>): data is Loading => data._tag === LOADING_TAG
328
328
 
329
329
  /**
330
330
  * @since 1.0.0
331
331
  */
332
- export const isNoData = <E, A>(data: AsyncData<E, A>): data is NoData => data._tag === NO_DATA_TAG
332
+ export const isNoData = <A, E>(data: AsyncData<A, E>): data is NoData => data._tag === NO_DATA_TAG
333
333
 
334
334
  /**
335
335
  * @since 1.0.0
336
336
  */
337
- export type Refreshing<E, A> = RefreshingFailure<E> | RefreshingSuccess<A>
337
+ export type Refreshing<A, E> = RefreshingFailure<E> | RefreshingSuccess<A>
338
338
 
339
339
  /**
340
340
  * @since 1.0.0
@@ -353,7 +353,7 @@ export interface RefreshingSuccess<A> extends Success<A> {
353
353
  /**
354
354
  * @since 1.0.0
355
355
  */
356
- export const isRefreshing = <E, A>(data: AsyncData<E, A>): data is Refreshing<E, A> =>
356
+ export const isRefreshing = <A, E>(data: AsyncData<A, E>): data is Refreshing<A, E> =>
357
357
  isSuccess(data) || isFailure(data)
358
358
  ? Option.isSome(data.refreshing)
359
359
  : isOptimistic(data)
@@ -363,39 +363,39 @@ export const isRefreshing = <E, A>(data: AsyncData<E, A>): data is Refreshing<E,
363
363
  /**
364
364
  * @since 1.0.0
365
365
  */
366
- export const isLoadingOrRefreshing = <E, A>(data: AsyncData<E, A>): data is Loading | Refreshing<E, A> =>
366
+ export const isLoadingOrRefreshing = <A, E>(data: AsyncData<A, E>): data is Loading | Refreshing<A, E> =>
367
367
  isLoading(data) || isRefreshing(data) || (isOptimistic(data) && isLoadingOrRefreshing(data.previous))
368
368
 
369
369
  /**
370
370
  * @since 1.0.0
371
371
  */
372
372
  export const match: {
373
- <E, A, R1, R2, R3, R4, R5>(
373
+ <A, E, R1, R2, R3, R4, R5>(
374
374
  matchers: {
375
375
  NoData: (data: NoData) => R1
376
376
  Loading: (data: Loading) => R2
377
377
  Failure: (cause: Cause.Cause<E>, data: Failure<E>) => R3
378
378
  Success: (value: A, data: Success<A>) => R4
379
- Optimistic: (value: A, data: Optimistic<E, A>) => R5
379
+ Optimistic: (value: A, data: Optimistic<A, E>) => R5
380
380
  }
381
- ): (data: AsyncData<E, A>) => Unify.Unify<R1 | R2 | R3 | R4 | R5>
381
+ ): (data: AsyncData<A, E>) => Unify.Unify<R1 | R2 | R3 | R4 | R5>
382
382
 
383
- <E, A, R1, R2, R3, R4, R5>(
384
- data: AsyncData<E, A>,
383
+ <A, E, R1, R2, R3, R4, R5>(
384
+ data: AsyncData<A, E>,
385
385
  matchers: {
386
386
  NoData: (data: NoData) => R1
387
387
  Loading: (data: Loading) => R2
388
388
  Failure: (cause: Cause.Cause<E>, data: Failure<E>) => R3
389
389
  Success: (value: A, data: Success<A>) => R4
390
- Optimistic: (value: A, data: Optimistic<E, A>) => R5
390
+ Optimistic: (value: A, data: Optimistic<A, E>) => R5
391
391
  }
392
392
  ): Unify.Unify<R1 | R2 | R3 | R4 | R5>
393
- } = dual(2, <E, A, R1, R2, R3, R4, R5>(data: AsyncData<E, A>, matchers: {
393
+ } = dual(2, <A, E, R1, R2, R3, R4, R5>(data: AsyncData<A, E>, matchers: {
394
394
  NoData: (data: NoData) => R1
395
395
  Loading: (data: Loading) => R2
396
396
  Failure: (cause: Cause.Cause<E>, data: Failure<E>) => R3
397
397
  Success: (value: A, data: Success<A>) => R4
398
- Optimistic: (value: A, data: Optimistic<E, A>) => R5
398
+ Optimistic: (value: A, data: Optimistic<A, E>) => R5
399
399
  }): Unify.Unify<R1 | R2 | R3 | R4> => {
400
400
  if (isSuccess(data)) {
401
401
  return matchers.Success(data.value, data) as Unify.Unify<R1 | R2 | R3 | R4>
@@ -414,9 +414,9 @@ export const match: {
414
414
  * @since 1.0.0
415
415
  */
416
416
  export const map: {
417
- <A, B>(f: (a: A) => B): <E>(data: AsyncData<E, A>) => AsyncData<E, B>
418
- <E, A, B>(data: AsyncData<E, A>, f: (a: A) => B): AsyncData<E, B>
419
- } = dual(2, function map<E, A, B>(data: AsyncData<E, A>, f: (a: A) => B): AsyncData<E, B> {
417
+ <A, B>(f: (a: A) => B): <E>(data: AsyncData<A, E>) => AsyncData<B, E>
418
+ <A, E, B>(data: AsyncData<A, E>, f: (a: A) => B): AsyncData<B, E>
419
+ } = dual(2, function map<A, E, B>(data: AsyncData<A, E>, f: (a: A) => B): AsyncData<B, E> {
420
420
  if (isSuccess(data)) {
421
421
  return success(f(data.value), {
422
422
  timestamp: data.timestamp,
@@ -433,19 +433,19 @@ export const map: {
433
433
  * @since 1.0.0
434
434
  */
435
435
  export const flatMap: {
436
- <E, A, E2, B>(
437
- f: (a: A, data: Success<A> | Optimistic<E, A>) => AsyncData<E2, B>
438
- ): (data: AsyncData<E, A>) => AsyncData<E | E2, B>
439
- <E, A, E2, B>(
440
- data: AsyncData<E, A>,
441
- f: (a: A, data: Success<A> | Optimistic<E, A>) => AsyncData<E, B>
442
- ): AsyncData<E | E2, B>
436
+ <A, E, B, E2>(
437
+ f: (a: A, data: Success<A> | Optimistic<A, E>) => AsyncData<B, E2>
438
+ ): (data: AsyncData<A, E>) => AsyncData<B, E | E2>
439
+ <A, E, B, E2>(
440
+ data: AsyncData<A, E>,
441
+ f: (a: A, data: Success<A> | Optimistic<A, E>) => AsyncData<B, E>
442
+ ): AsyncData<B, E | E2>
443
443
  } = dual(
444
444
  2,
445
- function<E, A, E2, B>(
446
- data: AsyncData<E, A>,
447
- f: (a: A, data: Success<A> | Optimistic<E, A>) => AsyncData<E2, B>
448
- ): AsyncData<E | E2, B> {
445
+ function<A, E, B, E2>(
446
+ data: AsyncData<A, E>,
447
+ f: (a: A, data: Success<A> | Optimistic<A, E>) => AsyncData<B, E2>
448
+ ): AsyncData<B, E | E2> {
449
449
  if (isSuccess(data) || isOptimistic(data)) {
450
450
  return f(data.value, data)
451
451
  } else {
@@ -457,7 +457,7 @@ export const flatMap: {
457
457
  /**
458
458
  * @since 1.0.0
459
459
  */
460
- export const startLoading = <E, A>(data: AsyncData<E, A>): AsyncData<E, A> => {
460
+ export const startLoading = <A, E>(data: AsyncData<A, E>): AsyncData<A, E> => {
461
461
  if (isSuccess(data)) {
462
462
  return Option.isSome(data.refreshing) ? data : success(data.value, { ...data, refreshing: loading() })
463
463
  } else if (isFailure(data)) {
@@ -474,7 +474,7 @@ export const startLoading = <E, A>(data: AsyncData<E, A>): AsyncData<E, A> => {
474
474
  /**
475
475
  * @since 1.0.0
476
476
  */
477
- export const stopLoading = <E, A>(data: AsyncData<E, A>): AsyncData<E, A> => {
477
+ export const stopLoading = <A, E>(data: AsyncData<A, E>): AsyncData<A, E> => {
478
478
  if (isSuccess(data)) {
479
479
  return Option.isSome(data.refreshing) ? success(data.value) : data
480
480
  } else if (isFailure(data)) {
@@ -489,12 +489,12 @@ export const stopLoading = <E, A>(data: AsyncData<E, A>): AsyncData<E, A> => {
489
489
  /**
490
490
  * @since 1.0.0
491
491
  */
492
- export const isAsyncData: <E, A>(u: unknown) => u is AsyncData<E, A> = internal.isAsyncData
492
+ export const isAsyncData: <A, E>(u: unknown) => u is AsyncData<A, E> = internal.isAsyncData
493
493
 
494
494
  /**
495
495
  * @since 1.0.0
496
496
  */
497
- export const done = <E, A>(exit: Exit.Exit<E, A>): AsyncData<E, A> =>
497
+ export const done = <A, E = never>(exit: Exit.Exit<A, E>): AsyncData<A, E> =>
498
498
  Exit.match(exit, {
499
499
  onFailure: (cause) => failCause(cause),
500
500
  onSuccess: (value) => success(value)
@@ -503,13 +503,13 @@ export const done = <E, A>(exit: Exit.Exit<E, A>): AsyncData<E, A> =>
503
503
  /**
504
504
  * @since 1.0.0
505
505
  */
506
- export const getFailure = <E, A>(data: AsyncData<E, A>): Option.Option<E> =>
506
+ export const getFailure = <A, E>(data: AsyncData<A, E>): Option.Option<E> =>
507
507
  isFailure(data) ? Cause.failureOption(data.cause) : Option.none()
508
508
 
509
509
  /**
510
510
  * @since 1.0.0
511
511
  */
512
- export const getSuccess = <E, A>(data: AsyncData<E, A>): Option.Option<A> =>
512
+ export const getSuccess = <A, E>(data: AsyncData<A, E>): Option.Option<A> =>
513
513
  isSuccess(data) || isOptimistic(data) ? Option.some(data.value) : Option.none()
514
514
 
515
515
  const optionProgressEq = Option.getEquivalence(Progress.equals)
@@ -537,10 +537,10 @@ const successEquivalence = <A>(valueEq: Equivalence.Equivalence<A>): Equivalence
537
537
  refreshing: optionLoadingEq
538
538
  })
539
539
 
540
- const optimisticEquivalence = <E, A>(
540
+ const optimisticEquivalence = <A, E>(
541
541
  valueEq: Equivalence.Equivalence<A>
542
- ): Equivalence.Equivalence<Optimistic<E, A>> => {
543
- let previousEq: Equivalence.Equivalence<AsyncData<E, A>> | undefined
542
+ ): Equivalence.Equivalence<Optimistic<A, E>> => {
543
+ let previousEq: Equivalence.Equivalence<AsyncData<A, E>> | undefined
544
544
  const get = () => {
545
545
  if (previousEq === undefined) {
546
546
  previousEq = getEquivalence(valueEq)
@@ -552,16 +552,16 @@ const optimisticEquivalence = <E, A>(
552
552
  _tag: Equivalence.string,
553
553
  value: valueEq,
554
554
  timestamp: Equivalence.number,
555
- previous: (a, b) => get()(a, b)
555
+ previous: (a: AsyncData<A, E>, b: AsyncData<A, E>) => get()(a, b)
556
556
  })
557
557
  }
558
558
 
559
559
  /**
560
560
  * @since 1.0.0
561
561
  */
562
- export const getEquivalence = <E, A>(
562
+ export const getEquivalence = <A, E>(
563
563
  valueEq: Equivalence.Equivalence<A> = Equal.equals
564
- ): Equivalence.Equivalence<AsyncData<E, A>> => {
564
+ ): Equivalence.Equivalence<AsyncData<A, E>> => {
565
565
  const successEq_ = successEquivalence(valueEq)
566
566
  const optimisticEq_ = optimisticEquivalence(valueEq)
567
567
  return (a, b) => {
@@ -580,7 +580,7 @@ export const getEquivalence = <E, A>(
580
580
  /**
581
581
  * @since 1.0.0
582
582
  */
583
- export function fromExit<E, A>(exit: Exit.Exit<E, A>): AsyncData<E, A> {
583
+ export function fromExit<A, E>(exit: Exit.Exit<A, E>): AsyncData<A, E> {
584
584
  return Exit.match(exit, {
585
585
  onFailure: (cause) => failCause(cause),
586
586
  onSuccess: (value) => success(value)
@@ -590,7 +590,7 @@ export function fromExit<E, A>(exit: Exit.Exit<E, A>): AsyncData<E, A> {
590
590
  /**
591
591
  * @since 1.0.0
592
592
  */
593
- export function fromEither<E, A>(either: Either.Either<E, A>): AsyncData<E, A> {
593
+ export function fromEither<E, A>(either: Either.Either<E, A>): AsyncData<A, E> {
594
594
  return Either.match(either, {
595
595
  onLeft: (e) => fail(e),
596
596
  onRight: (a) => success(a)
@@ -601,10 +601,10 @@ export function fromEither<E, A>(either: Either.Either<E, A>): AsyncData<E, A> {
601
601
  * @since 1.0.0
602
602
  */
603
603
  export const isExpired: {
604
- (ttl: Duration.DurationInput, now?: number): <E, A>(data: AsyncData<E, A>) => boolean
605
- <E, A>(data: AsyncData<E, A>, ttl: Duration.DurationInput, now?: number): boolean
606
- } = dual(isAsyncDataFirst, function isExpired<E, A>(
607
- data: AsyncData<E, A>,
604
+ (ttl: Duration.DurationInput, now?: number): <A, E>(data: AsyncData<A, E>) => boolean
605
+ <A, E>(data: AsyncData<A, E>, ttl: Duration.DurationInput, now?: number): boolean
606
+ } = dual(isAsyncDataFirst, function isExpired<A, E>(
607
+ data: AsyncData<A, E>,
608
608
  ttl: Duration.DurationInput,
609
609
  now: number = getCurrentTimestamp()
610
610
  ): boolean {
@@ -636,7 +636,7 @@ function isPastTTL(timestamp: number, ttl: Duration.DurationInput, now: number):
636
636
  *
637
637
  * @since 1.0.0
638
638
  */
639
- export function dataEqual<E, A>(first: AsyncData<E, A>, second: AsyncData<E, A>): boolean {
639
+ export function dataEqual<A, E>(first: AsyncData<A, E>, second: AsyncData<A, E>): boolean {
640
640
  return match(first, {
641
641
  NoData: () => isNoData(second),
642
642
  Loading: (l) => isLoading(second) && Equal.equals(l.progress, second.progress),
package/src/Progress.ts CHANGED
@@ -10,12 +10,9 @@ import * as Option from "effect/Option"
10
10
  /**
11
11
  * @since 1.0.0
12
12
  */
13
- export interface Progress extends
14
- Data.Data<{
15
- readonly loaded: bigint
16
- readonly total: Option.Option<bigint>
17
- }>
18
- {
13
+ export interface Progress {
14
+ readonly loaded: bigint
15
+ readonly total: Option.Option<bigint>
19
16
  }
20
17
 
21
18
  /**
@@ -62,9 +59,7 @@ export const setTotal: {
62
59
  /**
63
60
  * @since 1.0.0
64
61
  */
65
- export const equals: Equivalence.Equivalence<Progress> = Equivalence.struct<
66
- { readonly [K in Exclude<keyof Progress, keyof Data.Data<any>>]: Equivalence.Equivalence<Progress[K]> }
67
- >({
62
+ export const equals: Equivalence.Equivalence<Progress> = Equivalence.struct({
68
63
  loaded: Equivalence.bigint,
69
64
  total: Option.getEquivalence(Equivalence.bigint)
70
65
  })