@typed/fx 0.0.16 → 0.0.17

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/esm/Subject.js CHANGED
@@ -1,18 +1,30 @@
1
1
  import * as Effect from '@effect/core/io/Effect';
2
- import { pipe } from '@fp-ts/data/Function';
2
+ import * as Ref from '@effect/core/io/Ref';
3
+ import { AtomicInternal, UnsafeAPI } from '@effect/core/io/Ref/operations/_internal/AtomicInternal';
4
+ import { flow } from '@fp-ts/data/Function';
5
+ import { pipe } from '@tsplus/stdlib/data/Function';
3
6
  import * as Maybe from '@tsplus/stdlib/data/Maybe';
4
7
  import { never } from './fromEffect.js';
5
8
  import { Hold } from './hold.js';
6
9
  import { Multicast } from './multicast.js';
10
+ const FX_BRANDING = {
11
+ _R: () => void 0,
12
+ _E: () => void 0,
13
+ _A: () => void 0,
14
+ };
7
15
  export var Subject;
8
16
  (function (Subject) {
9
17
  Subject.unsafeMake = () => {
10
18
  const m = new Multicast(never);
11
19
  return {
20
+ ...FX_BRANDING,
12
21
  run: m.run.bind(m),
13
- emit: (a) => Effect.unsafeRunAsync(m.emit(a)),
14
- failCause: (c) => Effect.unsafeRunAsync(m.failCause(c)),
15
- end: () => Effect.unsafeRunAsync(m.end),
22
+ emit: m.emit.bind(m),
23
+ failCause: m.failCause.bind(m),
24
+ end: m.end,
25
+ unsafeEmit: (a) => Effect.unsafeRunAsync(m.emit(a)),
26
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(m.failCause(c)),
27
+ unsafeEnd: () => Effect.unsafeRunAsync(m.end),
16
28
  };
17
29
  };
18
30
  })(Subject || (Subject = {}));
@@ -20,12 +32,17 @@ export var HoldSubject;
20
32
  (function (HoldSubject) {
21
33
  HoldSubject.unsafeMake = () => {
22
34
  const h = new Hold(never);
35
+ const ref = new AtomicInternal(new UnsafeAPI(h.value));
23
36
  return {
37
+ ...FX_BRANDING,
38
+ ...ref,
24
39
  run: h.run.bind(h),
25
- get: h.get,
26
- emit: (a) => Effect.unsafeRunAsync(h.emit(a)),
27
- failCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
28
- end: () => Effect.unsafeRunAsync(h.end),
40
+ emit: h.emit.bind(h),
41
+ failCause: h.failCause.bind(h),
42
+ end: h.end,
43
+ unsafeEmit: (a) => Effect.unsafeRunAsync(h.emit(a)),
44
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
45
+ unsafeEnd: () => Effect.unsafeRunAsync(h.end),
29
46
  };
30
47
  };
31
48
  })(HoldSubject || (HoldSubject = {}));
@@ -33,17 +50,52 @@ export var BehaviorSubject;
33
50
  (function (BehaviorSubject) {
34
51
  BehaviorSubject.unsafeMake = (initial) => {
35
52
  const h = new Hold(never);
36
- // We're mutating a protected variable here to ensure an initial value is held.
37
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
38
- // @ts-expect-error
39
- h._value = Maybe.some(initial());
53
+ const maybeRef = new AtomicInternal(new UnsafeAPI(h.value));
54
+ const ref = invmapRef(maybeRef, Maybe.getOrElse(initial), Maybe.some);
55
+ // Ensure there is always a value in the Ref
56
+ h.value.set(Maybe.some(initial()));
40
57
  return {
58
+ ...FX_BRANDING,
59
+ ...ref,
41
60
  run: h.run.bind(h),
42
- get: pipe(h.get, Effect.map(Maybe.getOrElse(initial))),
43
- emit: (a) => Effect.unsafeRunAsync(h.emit(a)),
44
- failCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
45
- end: () => Effect.unsafeRunAsync(h.end),
61
+ emit: h.emit.bind(h),
62
+ failCause: h.failCause.bind(h),
63
+ end: h.end,
64
+ unsafeEmit: (a) => Effect.unsafeRunAsync(h.emit(a)),
65
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
66
+ unsafeEnd: () => Effect.unsafeRunAsync(h.end),
46
67
  };
47
68
  };
48
69
  })(BehaviorSubject || (BehaviorSubject = {}));
70
+ function invmapRef(ref, to, from) {
71
+ const get = pipe(ref.get, Effect.map(to));
72
+ const modify = (f) => ref.modify((a) => {
73
+ const [b, c] = f(to(a));
74
+ return [b, from(c)];
75
+ });
76
+ const set = flow(from, ref.set);
77
+ const getAndSet = flow(from, ref.getAndSet, Effect.map(to));
78
+ const getAndUpdate = (f) => pipe(ref.getAndUpdate(flow(to, f, from)), Effect.map(to));
79
+ const getAndUpdateSome = (f) => pipe(ref.getAndUpdateSome(flow(to, f, Maybe.map(from))), Effect.map(to));
80
+ const modifySome = (fallback, f) => ref.modifySome(fallback, (a) => pipe(a, to, f, Maybe.map(([c, b]) => [c, from(b)])));
81
+ const update = (f) => ref.update(flow(to, f, from));
82
+ const updateAndGet = (f) => pipe(ref.updateAndGet(flow(to, f, from)), Effect.map(to));
83
+ const updateSome = (f) => ref.updateSome(flow(to, f, Maybe.map(from)));
84
+ const updateSomeAndGet = (f) => pipe(ref.updateSomeAndGet(flow(to, f, Maybe.map(from))), Effect.map(to));
85
+ return {
86
+ [Ref.RefSym]: Ref.RefSym,
87
+ [Ref._A]: (_) => _,
88
+ get,
89
+ modify,
90
+ set,
91
+ getAndSet,
92
+ getAndUpdate,
93
+ getAndUpdateSome,
94
+ modifySome,
95
+ update,
96
+ updateAndGet,
97
+ updateSome,
98
+ updateSomeAndGet,
99
+ };
100
+ }
49
101
  //# sourceMappingURL=Subject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Subject.js","sourceRoot":"","sources":["../src/Subject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Subject.js","sourceRoot":"","sources":["../src/Subject.ts"],"names":[],"mappings":"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"}
package/esm/hold.d.ts CHANGED
@@ -2,17 +2,17 @@ import { Cause } from '@effect/core/io/Cause';
2
2
  import * as Effect from '@effect/core/io/Effect';
3
3
  import * as Fiber from '@effect/core/io/Fiber';
4
4
  import { Scope } from '@effect/core/io/Scope';
5
+ import { AtomicReference } from '@tsplus/stdlib/data/AtomicReference';
5
6
  import * as Maybe from '@tsplus/stdlib/data/Maybe';
6
7
  import { Emitter, Fx } from './Fx.js';
7
8
  import { Multicast, MulticastObserver } from './multicast.js';
8
9
  export declare function hold<R, E, A>(fx: Fx<R, E, A>): Fx<R, E, A>;
9
10
  export declare class Hold<R, E, A> extends Multicast<R, E, A> {
10
11
  readonly fx: Fx<R, E, A>;
11
- protected _value: Maybe.Maybe<A>;
12
+ readonly value: AtomicReference<Maybe.Maybe<A>>;
12
13
  protected _pendingEmitters: Array<readonly [Emitter<unknown, E, A>, A[]]>;
13
14
  protected _scheduledFiber: Fiber.RealFiber<any, any> | undefined;
14
15
  constructor(fx: Fx<R, E, A>);
15
- readonly get: Effect.Effect<never, never, Maybe.Maybe<A>>;
16
16
  run<R2>(emitter: Emitter<R2, E, A>): Effect.Effect<R | R2 | Scope, never, unknown>;
17
17
  emit(value: A): Effect.Effect<never, never, void>;
18
18
  failCause(cause: Cause<E>): Effect.Effect<never, never, void>;
package/esm/hold.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hold.d.ts","sourceRoot":"","sources":["../src/hold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAG7C,OAAO,KAAK,KAAK,MAAM,2BAA2B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAE1D;AAED,qBAAa,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAKvC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAJpC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAa;IAC7C,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAK;IAC9E,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;gBAE3C,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAIpC,QAAQ,CAAC,GAAG,8CAAiC;IAE7C,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;IAWlF,IAAI,CAAC,KAAK,EAAE,CAAC;IAWb,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IASzB,IAAI,GAAG,sCAON;IAED,SAAS,CAAC,mBAAmB;IAI7B,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IA6BrD,SAAS,CAAC,YAAY;IAsBtB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAQ3B,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;CAG7F"}
1
+ {"version":3,"file":"hold.d.ts","sourceRoot":"","sources":["../src/hold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAErE,OAAO,KAAK,KAAK,MAAM,2BAA2B,CAAA;AAElD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAE1D;AAED,qBAAa,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAKvC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAJpC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAkC;IACjF,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAK;IAC9E,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;gBAE3C,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAIpC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC;IAWlF,IAAI,CAAC,KAAK,EAAE,CAAC;IAWb,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IASzB,IAAI,GAAG,sCAON;IAED,SAAS,CAAC,mBAAmB;IAI7B,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IA6BrD,SAAS,CAAC,YAAY;IAsBtB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAQ3B,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;CAG7F"}
package/esm/hold.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as Effect from '@effect/core/io/Effect';
2
2
  import * as FiberId from '@effect/core/io/FiberId';
3
3
  import { pipe } from '@fp-ts/data/Function';
4
+ import { AtomicReference } from '@tsplus/stdlib/data/AtomicReference';
4
5
  import * as Duration from '@tsplus/stdlib/data/Duration';
5
6
  import * as Maybe from '@tsplus/stdlib/data/Maybe';
6
7
  import { Multicast } from './multicast.js';
@@ -9,14 +10,13 @@ export function hold(fx) {
9
10
  }
10
11
  export class Hold extends Multicast {
11
12
  fx;
12
- _value = Maybe.none;
13
+ value = new AtomicReference(Maybe.none);
13
14
  _pendingEmitters = [];
14
15
  _scheduledFiber;
15
16
  constructor(fx) {
16
17
  super(fx);
17
18
  this.fx = fx;
18
19
  }
19
- get = Effect.sync(() => this._value);
20
20
  run(emitter) {
21
21
  if (this.shouldScheduleFlush()) {
22
22
  return pipe(this.scheduleFlush(emitter), Effect.flatMap(() => super.run(emitter)));
@@ -36,12 +36,12 @@ export class Hold extends Multicast {
36
36
  return Effect.suspendSucceed(() => pipe(this.flushPending(), Effect.flatMap(() => super.end)));
37
37
  }
38
38
  shouldScheduleFlush() {
39
- return Maybe.isSome(this._value) && this.observers.length > 0;
39
+ return Maybe.isSome(this.value.get) && this.observers.length > 0;
40
40
  }
41
41
  scheduleFlush(observer) {
42
42
  this._pendingEmitters.push([
43
43
  observer,
44
- pipe(this._value, Maybe.fold(() => [], (a) => [a])),
44
+ pipe(this.value.get, Maybe.fold(() => [], (a) => [a])),
45
45
  ]);
46
46
  const interrupt = this._scheduledFiber
47
47
  ? this._scheduledFiber.interruptAsFork(new FiberId.None())
@@ -65,7 +65,7 @@ export class Hold extends Multicast {
65
65
  }));
66
66
  }
67
67
  addValue(value) {
68
- this._value = Maybe.some(value);
68
+ this.value.set(Maybe.some(value));
69
69
  this._pendingEmitters.forEach(([, values]) => {
70
70
  values.push(value);
71
71
  });
package/esm/hold.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hold.js","sourceRoot":"","sources":["../src/hold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hold.js","sourceRoot":"","sources":["../src/hold.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as Effect from '@effect/core/io/Effect';
2
2
  import { Fx } from './Fx.js';
3
- import type { SubjectEmitter } from './Subject.js';
4
- export declare function withEmitter<R, E, A>(f: (emitter: SubjectEmitter<E, A>) => Effect.Canceler<R>): Fx<R, E, A>;
3
+ import type { UnsafeEmitter } from './Subject.js';
4
+ export declare function withEmitter<R, E, A>(f: (emitter: UnsafeEmitter<E, A>) => Effect.Canceler<R>): Fx<R, E, A>;
5
5
  //# sourceMappingURL=withEmitter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withEmitter.d.ts","sourceRoot":"","sources":["../src/withEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAMhD,OAAO,EAAW,EAAE,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GACvD,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAiCb"}
1
+ {"version":3,"file":"withEmitter.d.ts","sourceRoot":"","sources":["../src/withEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAMhD,OAAO,EAAW,EAAE,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GACtD,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAiCb"}
@@ -14,9 +14,9 @@ export function withEmitter(f) {
14
14
  let canceler = Effect.unit;
15
15
  return pipe(Effect.addFinalizer(Effect.suspendSucceed(() => canceler)), Effect.zipRight(Effect.asyncEffect((cb) => {
16
16
  canceler = f({
17
- emit: (a) => unsafeRun(sink.emit(a), (exit) => Exit.isFailure(exit) ? cb(Effect.failCause(exit.cause)) : undefined),
18
- failCause: (e) => unsafeRun(sink.failCause(e), flow(Effect.done, cb)),
19
- end: () => unsafeRun(sink.end, flow(Effect.done, cb)),
17
+ unsafeEmit: (a) => unsafeRun(sink.emit(a), (exit) => Exit.isFailure(exit) ? cb(Effect.failCause(exit.cause)) : undefined),
18
+ unsafeFailCause: (e) => unsafeRun(sink.failCause(e), flow(Effect.done, cb)),
19
+ unsafeEnd: () => unsafeRun(sink.end, flow(Effect.done, cb)),
20
20
  });
21
21
  return canceler;
22
22
  })));
@@ -1 +1 @@
1
- {"version":3,"file":"withEmitter.js","sourceRoot":"","sources":["../src/withEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAE7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAW,EAAE,EAAE,MAAM,SAAS,CAAA;AAGrC,MAAM,UAAU,WAAW,CACzB,CAAwD;IAExD,OAAO,EAAE,CAAU,CAAK,IAAuB,EAAE,EAAE;QACjD,OAAO,MAAM,CAAC,gBAAgB,CAAiC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/E,MAAM,SAAS,GAAG,CAChB,GAA2B,EAC3B,QAAyC,EACzC,EAAE;gBACF,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;gBAC9D,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;gBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACd,CAAC,CAAA;YAED,IAAI,QAAQ,GAAuB,MAAM,CAAC,IAAI,CAAA;YAE9C,OAAO,IAAI,CACT,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,EAC1D,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,WAAW,CAA6C,CAAC,EAAE,EAAE,EAAE;gBACpE,QAAQ,GAAG,CAAC,CAAC;oBACX,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CACV,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACpE;oBACH,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACrE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBACtD,CAAC,CAAA;gBAEF,OAAO,QAAQ,CAAA;YACjB,CAAC,CAAC,CACH,CACF,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"withEmitter.js","sourceRoot":"","sources":["../src/withEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAA;AAE7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAW,EAAE,EAAE,MAAM,SAAS,CAAA;AAGrC,MAAM,UAAU,WAAW,CACzB,CAAuD;IAEvD,OAAO,EAAE,CAAU,CAAK,IAAuB,EAAE,EAAE;QACjD,OAAO,MAAM,CAAC,gBAAgB,CAAiC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/E,MAAM,SAAS,GAAG,CAChB,GAA2B,EAC3B,QAAyC,EACzC,EAAE;gBACF,MAAM,CAAC,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;gBAC9D,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;gBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACd,CAAC,CAAA;YAED,IAAI,QAAQ,GAAuB,MAAM,CAAC,IAAI,CAAA;YAE9C,OAAO,IAAI,CACT,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,EAC1D,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,WAAW,CAA6C,CAAC,EAAE,EAAE,EAAE;gBACpE,QAAQ,GAAG,CAAC,CAAC;oBACX,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAChB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACpE;oBACH,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3E,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;iBAC5D,CAAC,CAAA;gBAEF,OAAO,QAAQ,CAAA;YACjB,CAAC,CAAC,CACH,CACF,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed/fx",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "description": "High-performance Asynchronous Effects",
5
5
  "type": "module",
6
6
  "main": "esm/index.js",
@@ -1,6 +1,7 @@
1
1
  import { deepStrictEqual } from 'assert'
2
2
 
3
3
  import * as Effect from '@effect/core/io/Effect'
4
+ import * as Fiber from '@effect/core/io/Fiber'
4
5
  import { pipe } from '@fp-ts/data/Function'
5
6
 
6
7
  import * as Fx from './index.js'
@@ -12,17 +13,55 @@ describe(import.meta.url, () => {
12
13
  const promise = pipe(
13
14
  subject,
14
15
  Fx.map((n) => n * 2),
15
- Fx.take(3),
16
16
  Fx.runCollect,
17
17
  Effect.unsafeRunPromise,
18
18
  )
19
19
 
20
- subject.emit(1)
21
- subject.emit(2)
22
- subject.emit(3)
23
- subject.end()
20
+ subject.unsafeEmit(1)
21
+ subject.unsafeEmit(2)
22
+ subject.unsafeEmit(3)
23
+ subject.unsafeEnd()
24
24
 
25
25
  deepStrictEqual(await promise, [2, 4, 6])
26
26
  })
27
27
  })
28
+
29
+ describe('BehaviorSubject', () => {
30
+ it('creates a Ref to sample the current value of the stream', async () => {
31
+ const test = Effect.gen(function* ($) {
32
+ const subject = Fx.BehaviorSubject.unsafeMake<never, number>(() => 1)
33
+ const fiber = yield* $(
34
+ pipe(
35
+ subject,
36
+ Fx.map((n) => n * 2),
37
+ Fx.filter((x) => x % 2 === 0),
38
+ Fx.runCollect,
39
+ Effect.fork,
40
+ ),
41
+ )
42
+
43
+ deepStrictEqual(yield* $(subject.get), 1)
44
+
45
+ yield* $(subject.emit(1))
46
+
47
+ deepStrictEqual(yield* $(subject.get), 1)
48
+
49
+ yield* $(subject.emit(2))
50
+
51
+ deepStrictEqual(yield* $(subject.get), 2)
52
+
53
+ yield* $(subject.emit(3))
54
+
55
+ deepStrictEqual(yield* $(subject.get), 3)
56
+
57
+ yield* $(subject.end)
58
+
59
+ const events = yield* $(Fiber.join(fiber))
60
+
61
+ deepStrictEqual(events, [2, 4, 6])
62
+ })
63
+
64
+ await Effect.unsafeRunPromise(test)
65
+ })
66
+ })
28
67
  })
package/src/Subject.ts CHANGED
@@ -1,20 +1,28 @@
1
1
  import { Cause } from '@effect/core/io/Cause'
2
2
  import * as Effect from '@effect/core/io/Effect'
3
- import { pipe } from '@fp-ts/data/Function'
4
- import { LazyArg } from '@tsplus/stdlib/data/Function'
3
+ import * as Ref from '@effect/core/io/Ref'
4
+ import { AtomicInternal, UnsafeAPI } from '@effect/core/io/Ref/operations/_internal/AtomicInternal'
5
+ import { flow } from '@fp-ts/data/Function'
6
+ import { LazyArg, pipe } from '@tsplus/stdlib/data/Function'
5
7
  import * as Maybe from '@tsplus/stdlib/data/Maybe'
6
8
 
7
- import { Fx } from './Fx.js'
9
+ import { Emitter, Fx } from './Fx.js'
8
10
  import { never } from './fromEffect.js'
9
11
  import { Hold } from './hold.js'
10
12
  import { Multicast } from './multicast.js'
11
13
 
12
- export interface Subject<E, A> extends SubjectEmitter<E, A>, Fx<never, E, A> {}
14
+ export interface Subject<E, A> extends Fx<never, E, A>, Emitter<never, E, A>, UnsafeEmitter<E, A> {}
13
15
 
14
- export interface SubjectEmitter<E, A> {
15
- readonly emit: (a: A) => void
16
- readonly failCause: (cause: Cause<E>) => void
17
- readonly end: () => void
16
+ export interface UnsafeEmitter<E, A> {
17
+ readonly unsafeEmit: (a: A) => void
18
+ readonly unsafeFailCause: (cause: Cause<E>) => void
19
+ readonly unsafeEnd: () => void
20
+ }
21
+
22
+ const FX_BRANDING = {
23
+ _R: () => void 0 as never,
24
+ _E: () => void 0 as any,
25
+ _A: () => void 0 as any,
18
26
  }
19
27
 
20
28
  export namespace Subject {
@@ -22,51 +30,116 @@ export namespace Subject {
22
30
  const m = new Multicast<never, E, A>(never)
23
31
 
24
32
  return {
33
+ ...FX_BRANDING,
25
34
  run: m.run.bind(m),
26
- emit: (a) => Effect.unsafeRunAsync(m.emit(a)),
27
- failCause: (c) => Effect.unsafeRunAsync(m.failCause(c)),
28
- end: () => Effect.unsafeRunAsync(m.end),
29
- } as Subject<E, A>
35
+ emit: m.emit.bind(m),
36
+ failCause: m.failCause.bind(m),
37
+ end: m.end,
38
+ unsafeEmit: (a) => Effect.unsafeRunAsync(m.emit(a)),
39
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(m.failCause(c)),
40
+ unsafeEnd: () => Effect.unsafeRunAsync(m.end),
41
+ }
30
42
  }
31
43
  }
32
44
 
33
- export interface HoldSubject<E, A> extends Subject<E, A> {
34
- readonly get: Effect.Effect<never, never, Maybe.Maybe<A>>
35
- }
45
+ export interface HoldSubject<E, A> extends Subject<E, A>, Ref.Ref<Maybe.Maybe<A>> {}
36
46
 
37
47
  export namespace HoldSubject {
38
48
  export const unsafeMake = <E, A>(): HoldSubject<E, A> => {
39
49
  const h = new Hold<never, E, A>(never)
50
+ const ref: Ref.Ref<Maybe.Maybe<A>> = new AtomicInternal(new UnsafeAPI(h.value))
40
51
 
41
52
  return {
53
+ ...FX_BRANDING,
54
+ ...ref,
42
55
  run: h.run.bind(h),
43
- get: h.get,
44
- emit: (a) => Effect.unsafeRunAsync(h.emit(a)),
45
- failCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
46
- end: () => Effect.unsafeRunAsync(h.end),
47
- } as HoldSubject<E, A>
56
+ emit: h.emit.bind(h),
57
+ failCause: h.failCause.bind(h),
58
+ end: h.end,
59
+ unsafeEmit: (a) => Effect.unsafeRunAsync(h.emit(a)),
60
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
61
+ unsafeEnd: () => Effect.unsafeRunAsync(h.end),
62
+ }
48
63
  }
49
64
  }
50
65
 
51
- export interface BehaviorSubject<E, A> extends Subject<E, A> {
52
- readonly get: Effect.Effect<never, never, A>
53
- }
66
+ export interface BehaviorSubject<E, A> extends Subject<E, A>, Ref.Ref<A> {}
54
67
 
55
68
  export namespace BehaviorSubject {
56
69
  export const unsafeMake = <E, A>(initial: LazyArg<A>): BehaviorSubject<E, A> => {
57
70
  const h = new Hold<never, E, A>(never)
71
+ const maybeRef: Ref.Ref<Maybe.Maybe<A>> = new AtomicInternal(new UnsafeAPI(h.value))
72
+ const ref = invmapRef(maybeRef, Maybe.getOrElse(initial), Maybe.some)
58
73
 
59
- // We're mutating a protected variable here to ensure an initial value is held.
60
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
- // @ts-expect-error
62
- h._value = Maybe.some(initial())
74
+ // Ensure there is always a value in the Ref
75
+ h.value.set(Maybe.some(initial()))
63
76
 
64
77
  return {
78
+ ...FX_BRANDING,
79
+ ...ref,
65
80
  run: h.run.bind(h),
66
- get: pipe(h.get, Effect.map(Maybe.getOrElse(initial))),
67
- emit: (a) => Effect.unsafeRunAsync(h.emit(a)),
68
- failCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
69
- end: () => Effect.unsafeRunAsync(h.end),
70
- } as BehaviorSubject<E, A>
81
+ emit: h.emit.bind(h),
82
+ failCause: h.failCause.bind(h),
83
+ end: h.end,
84
+ unsafeEmit: (a) => Effect.unsafeRunAsync(h.emit(a)),
85
+ unsafeFailCause: (c) => Effect.unsafeRunAsync(h.failCause(c)),
86
+ unsafeEnd: () => Effect.unsafeRunAsync(h.end),
87
+ }
88
+ }
89
+ }
90
+
91
+ function invmapRef<A, B>(ref: Ref.Ref<A>, to: (a: A) => B, from: (b: B) => A): Ref.Ref<B> {
92
+ const get: Ref.Ref<B>['get'] = pipe(ref.get, Effect.map(to))
93
+
94
+ const modify: Ref.Ref<B>['modify'] = (f) =>
95
+ ref.modify((a) => {
96
+ const [b, c] = f(to(a))
97
+ return [b, from(c)]
98
+ })
99
+
100
+ const set: Ref.Ref<B>['set'] = flow(from, ref.set)
101
+
102
+ const getAndSet: Ref.Ref<B>['getAndSet'] = flow(from, ref.getAndSet, Effect.map(to))
103
+
104
+ const getAndUpdate: Ref.Ref<B>['getAndUpdate'] = (f) =>
105
+ pipe(ref.getAndUpdate(flow(to, f, from)), Effect.map(to))
106
+
107
+ const getAndUpdateSome: Ref.Ref<B>['getAndUpdateSome'] = (f) =>
108
+ pipe(ref.getAndUpdateSome(flow(to, f, Maybe.map(from))), Effect.map(to))
109
+
110
+ const modifySome: Ref.Ref<B>['modifySome'] = (fallback, f) =>
111
+ ref.modifySome(fallback, (a) =>
112
+ pipe(
113
+ a,
114
+ to,
115
+ f,
116
+ Maybe.map(([c, b]) => [c, from(b)]),
117
+ ),
118
+ )
119
+
120
+ const update: Ref.Ref<B>['update'] = (f) => ref.update(flow(to, f, from))
121
+
122
+ const updateAndGet: Ref.Ref<B>['updateAndGet'] = (f) =>
123
+ pipe(ref.updateAndGet(flow(to, f, from)), Effect.map(to))
124
+
125
+ const updateSome: Ref.Ref<B>['updateSome'] = (f) => ref.updateSome(flow(to, f, Maybe.map(from)))
126
+
127
+ const updateSomeAndGet: Ref.Ref<B>['updateSomeAndGet'] = (f) =>
128
+ pipe(ref.updateSomeAndGet(flow(to, f, Maybe.map(from))), Effect.map(to))
129
+
130
+ return {
131
+ [Ref.RefSym]: Ref.RefSym,
132
+ [Ref._A]: (_) => _,
133
+ get,
134
+ modify,
135
+ set,
136
+ getAndSet,
137
+ getAndUpdate,
138
+ getAndUpdateSome,
139
+ modifySome,
140
+ update,
141
+ updateAndGet,
142
+ updateSome,
143
+ updateSomeAndGet,
71
144
  }
72
145
  }
package/src/hold.ts CHANGED
@@ -4,6 +4,7 @@ import * as Fiber from '@effect/core/io/Fiber'
4
4
  import * as FiberId from '@effect/core/io/FiberId'
5
5
  import { Scope } from '@effect/core/io/Scope'
6
6
  import { pipe } from '@fp-ts/data/Function'
7
+ import { AtomicReference } from '@tsplus/stdlib/data/AtomicReference'
7
8
  import * as Duration from '@tsplus/stdlib/data/Duration'
8
9
  import * as Maybe from '@tsplus/stdlib/data/Maybe'
9
10
 
@@ -15,7 +16,7 @@ export function hold<R, E, A>(fx: Fx<R, E, A>): Fx<R, E, A> {
15
16
  }
16
17
 
17
18
  export class Hold<R, E, A> extends Multicast<R, E, A> {
18
- protected _value: Maybe.Maybe<A> = Maybe.none
19
+ readonly value: AtomicReference<Maybe.Maybe<A>> = new AtomicReference(Maybe.none)
19
20
  protected _pendingEmitters: Array<readonly [Emitter<unknown, E, A>, A[]]> = []
20
21
  protected _scheduledFiber: Fiber.RealFiber<any, any> | undefined
21
22
 
@@ -23,8 +24,6 @@ export class Hold<R, E, A> extends Multicast<R, E, A> {
23
24
  super(fx)
24
25
  }
25
26
 
26
- readonly get = Effect.sync(() => this._value)
27
-
28
27
  run<R2>(emitter: Emitter<R2, E, A>): Effect.Effect<R | R2 | Scope, never, unknown> {
29
28
  if (this.shouldScheduleFlush()) {
30
29
  return pipe(
@@ -66,14 +65,14 @@ export class Hold<R, E, A> extends Multicast<R, E, A> {
66
65
  }
67
66
 
68
67
  protected shouldScheduleFlush() {
69
- return Maybe.isSome(this._value) && this.observers.length > 0
68
+ return Maybe.isSome(this.value.get) && this.observers.length > 0
70
69
  }
71
70
 
72
71
  protected scheduleFlush<R>(observer: Emitter<R, E, A>) {
73
72
  this._pendingEmitters.push([
74
73
  observer,
75
74
  pipe(
76
- this._value,
75
+ this.value.get,
77
76
  Maybe.fold(
78
77
  () => [],
79
78
  (a) => [a],
@@ -121,7 +120,7 @@ export class Hold<R, E, A> extends Multicast<R, E, A> {
121
120
  }
122
121
 
123
122
  protected addValue(value: A) {
124
- this._value = Maybe.some(value)
123
+ this.value.set(Maybe.some(value))
125
124
 
126
125
  this._pendingEmitters.forEach(([, values]) => {
127
126
  values.push(value)
@@ -10,10 +10,10 @@ describe(import.meta.url, () => {
10
10
  it('should allow converting sync callbacks into an Fx', async () => {
11
11
  const test = pipe(
12
12
  Fx.withEmitter((emitter) => {
13
- emitter.emit(1)
14
- emitter.emit(2)
15
- emitter.emit(3)
16
- emitter.end()
13
+ emitter.unsafeEmit(1)
14
+ emitter.unsafeEmit(2)
15
+ emitter.unsafeEmit(3)
16
+ emitter.unsafeEnd()
17
17
 
18
18
  return Effect.unit
19
19
  }),
@@ -5,10 +5,10 @@ import { Scope } from '@effect/core/io/Scope'
5
5
  import { flow, pipe } from '@fp-ts/data/Function'
6
6
 
7
7
  import { Emitter, Fx } from './Fx.js'
8
- import type { SubjectEmitter } from './Subject.js'
8
+ import type { UnsafeEmitter } from './Subject.js'
9
9
 
10
10
  export function withEmitter<R, E, A>(
11
- f: (emitter: SubjectEmitter<E, A>) => Effect.Canceler<R>,
11
+ f: (emitter: UnsafeEmitter<E, A>) => Effect.Canceler<R>,
12
12
  ): Fx<R, E, A> {
13
13
  return Fx<R, E, A>(<R2>(sink: Emitter<R2, E, A>) => {
14
14
  return Effect.withFiberRuntime<R | R2 | Scope, never, unknown>((fiber, status) => {
@@ -28,12 +28,12 @@ export function withEmitter<R, E, A>(
28
28
  Effect.zipRight(
29
29
  Effect.asyncEffect<R | R2, never, unknown, R | R2, never, any>((cb) => {
30
30
  canceler = f({
31
- emit: (a) =>
31
+ unsafeEmit: (a) =>
32
32
  unsafeRun(sink.emit(a), (exit) =>
33
33
  Exit.isFailure(exit) ? cb(Effect.failCause(exit.cause)) : undefined,
34
34
  ),
35
- failCause: (e) => unsafeRun(sink.failCause(e), flow(Effect.done, cb)),
36
- end: () => unsafeRun(sink.end, flow(Effect.done, cb)),
35
+ unsafeFailCause: (e) => unsafeRun(sink.failCause(e), flow(Effect.done, cb)),
36
+ unsafeEnd: () => unsafeRun(sink.end, flow(Effect.done, cb)),
37
37
  })
38
38
 
39
39
  return canceler