@typed/fx 1.12.4 → 1.12.6
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/keyed.d.ts.map +1 -1
- package/dist/cjs/keyed.js +65 -30
- package/dist/cjs/keyed.js.map +1 -1
- package/dist/keyed.d.ts.map +1 -1
- package/dist/keyed.js +65 -27
- package/dist/keyed.js.map +1 -1
- package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/keyed.ts +101 -63
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/cjs/keyed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../../src/keyed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../../src/keyed.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,EAAE,EAAQ,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAK5C,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EACzC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAC1B,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAC9C,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAClB,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAyClC"}
|
package/dist/cjs/keyed.js
CHANGED
|
@@ -22,18 +22,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
26
|
exports.keyed = void 0;
|
|
30
27
|
const MutableHashMap = __importStar(require("@effect/data/MutableHashMap"));
|
|
31
28
|
const Option = __importStar(require("@effect/data/Option"));
|
|
32
29
|
const ReadonlyArray = __importStar(require("@effect/data/ReadonlyArray"));
|
|
33
|
-
const Equivalence = __importStar(require("@effect/data/typeclass/Equivalence"));
|
|
34
30
|
const Effect = __importStar(require("@effect/io/Effect"));
|
|
35
31
|
const Fiber = __importStar(require("@effect/io/Fiber"));
|
|
36
|
-
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
|
|
37
32
|
const Fx_js_1 = require("./Fx.js");
|
|
38
33
|
const RefSubject_js_1 = require("./RefSubject.js");
|
|
39
34
|
const Subject_js_1 = require("./Subject.js");
|
|
@@ -41,69 +36,105 @@ const helpers_js_1 = require("./helpers.js");
|
|
|
41
36
|
function keyed(fx, f, getKey) {
|
|
42
37
|
return (0, Fx_js_1.Fx)((sink) => (0, helpers_js_1.withScopedFork)((fork) => Effect.gen(function* ($) {
|
|
43
38
|
const state = createKeyedState();
|
|
44
|
-
const eq = Equivalence.make((x, y) => (0, fast_deep_equal_1.default)(getKey(x), getKey(y)));
|
|
45
|
-
const difference = ReadonlyArray.difference(eq);
|
|
46
|
-
const intersection = ReadonlyArray.intersection(eq);
|
|
47
39
|
const emit = emitWhenReady(state, getKey);
|
|
48
40
|
// Let output emit to the sink
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
yield* $(fx.run((0, Fx_js_1.Sink)((as) => updateState({
|
|
41
|
+
yield* $(fork(state.output.run(sink)));
|
|
42
|
+
const params = {
|
|
52
43
|
state,
|
|
53
|
-
updated: as,
|
|
54
44
|
getKey,
|
|
55
45
|
f,
|
|
56
46
|
fork,
|
|
57
|
-
difference,
|
|
58
|
-
intersection,
|
|
59
47
|
emit,
|
|
60
48
|
error: sink.error,
|
|
49
|
+
};
|
|
50
|
+
// Listen to the input and update the state
|
|
51
|
+
yield* $(fx.run((0, Fx_js_1.Sink)((updated) => updateState({
|
|
52
|
+
...params,
|
|
53
|
+
updated,
|
|
61
54
|
}), sink.error)));
|
|
62
|
-
yield* $(endAll(state));
|
|
63
55
|
// When the source stream ends we wait for the remaining fibers to end
|
|
64
56
|
yield* $(Fiber.joinAll(Array.from(state.fibers).map((x) => x[1])));
|
|
65
|
-
//
|
|
66
|
-
yield* $(
|
|
57
|
+
// Send end signals to all Fx listening to subjects to allow finalization
|
|
58
|
+
yield* $(endAll(state));
|
|
67
59
|
})));
|
|
68
60
|
}
|
|
69
61
|
exports.keyed = keyed;
|
|
70
62
|
function createKeyedState() {
|
|
71
63
|
return {
|
|
72
64
|
previous: [],
|
|
73
|
-
|
|
65
|
+
previousKeys: new Set(),
|
|
74
66
|
subjects: MutableHashMap.empty(),
|
|
75
67
|
fibers: MutableHashMap.empty(),
|
|
76
68
|
values: MutableHashMap.empty(),
|
|
77
69
|
output: (0, Subject_js_1.makeHoldSubject)(),
|
|
78
70
|
};
|
|
79
71
|
}
|
|
80
|
-
function updateState(
|
|
72
|
+
function updateState(params) {
|
|
73
|
+
const { state, updated, emit, getKey } = params;
|
|
81
74
|
return Effect.gen(function* ($) {
|
|
82
|
-
const added =
|
|
83
|
-
const removed = difference(state.previous, updated);
|
|
84
|
-
const unchanged = intersection(updated, state.previous);
|
|
85
|
-
state.previous = updated;
|
|
75
|
+
const { added, removed, unchanged } = diffValues(state, updated, getKey);
|
|
86
76
|
// Remove values that are no longer in the stream
|
|
87
|
-
|
|
77
|
+
if (removed.length > 0) {
|
|
78
|
+
yield* $(Effect.forEachDiscard(removed, (key) => removeValue(state, key)));
|
|
79
|
+
}
|
|
88
80
|
// Add values that are new to the stream
|
|
89
|
-
|
|
81
|
+
if (added.length > 0) {
|
|
82
|
+
yield* $(Effect.forEachDiscard(added, (value) => addValue({ ...params, value })));
|
|
83
|
+
}
|
|
90
84
|
// Update values that are still in the stream
|
|
91
|
-
|
|
85
|
+
if (unchanged.length > 0) {
|
|
86
|
+
yield* $(Effect.forEachDiscard(unchanged, (value) => updateValue(state, value, getKey)));
|
|
87
|
+
}
|
|
92
88
|
// If nothing was added, emit the current values
|
|
93
89
|
if (added.length === 0) {
|
|
94
90
|
yield* $(emit);
|
|
95
91
|
}
|
|
96
92
|
});
|
|
97
93
|
}
|
|
98
|
-
function
|
|
99
|
-
|
|
94
|
+
function diffValues(state, updated, getKey) {
|
|
95
|
+
const previousKeys = state.previousKeys;
|
|
96
|
+
const keys = new Set(updated.map(getKey));
|
|
97
|
+
state.previous = updated;
|
|
98
|
+
state.previousKeys = keys;
|
|
99
|
+
if (previousKeys.size === 0) {
|
|
100
|
+
return {
|
|
101
|
+
added: updated,
|
|
102
|
+
unchanged: [],
|
|
103
|
+
removed: [],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const added = [];
|
|
107
|
+
const unchanged = [];
|
|
108
|
+
const removed = [];
|
|
109
|
+
for (let i = 0; i < updated.length; ++i) {
|
|
110
|
+
const value = updated[i];
|
|
100
111
|
const key = getKey(value);
|
|
112
|
+
if (previousKeys.has(key)) {
|
|
113
|
+
unchanged.push(value);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
added.push(value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
previousKeys.forEach((k) => {
|
|
120
|
+
if (!keys.has(k)) {
|
|
121
|
+
removed.push(k);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
added,
|
|
126
|
+
unchanged,
|
|
127
|
+
removed,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function removeValue(state, key) {
|
|
131
|
+
return Effect.gen(function* ($) {
|
|
101
132
|
const subject = MutableHashMap.get(state.subjects, key);
|
|
102
133
|
if (Option.isSome(subject))
|
|
103
|
-
yield* $(subject.value.end());
|
|
134
|
+
yield* $(Effect.fork(subject.value.end()));
|
|
104
135
|
const fiber = MutableHashMap.get(state.fibers, key);
|
|
105
136
|
if (Option.isSome(fiber))
|
|
106
|
-
yield* $(Fiber.
|
|
137
|
+
yield* $(Fiber.interruptFork(fiber.value));
|
|
107
138
|
MutableHashMap.remove(state.values, key);
|
|
108
139
|
MutableHashMap.remove(state.subjects, key);
|
|
109
140
|
MutableHashMap.remove(state.fibers, key);
|
|
@@ -133,6 +164,10 @@ function updateValue(state, value, getKey) {
|
|
|
133
164
|
}
|
|
134
165
|
function emitWhenReady(state, getKey) {
|
|
135
166
|
return Effect.suspend(() => {
|
|
167
|
+
// Fast path: if we don't have enough values, don't emit
|
|
168
|
+
if (MutableHashMap.size(state.values) !== state.previous.length) {
|
|
169
|
+
return Effect.unit();
|
|
170
|
+
}
|
|
136
171
|
const values = ReadonlyArray.filterMap(state.previous, (value) => MutableHashMap.get(state.values, getKey(value)));
|
|
137
172
|
// When all of the values have resolved at least once, emit the output
|
|
138
173
|
if (values.length === state.previous.length) {
|
package/dist/cjs/keyed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed.js","sourceRoot":"","sources":["../../src/keyed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyed.js","sourceRoot":"","sources":["../../src/keyed.ts"],"names":[],"mappings":"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"}
|
package/dist/keyed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../src/keyed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../src/keyed.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,EAAE,EAAQ,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAK5C,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EACzC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAC1B,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAC9C,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAClB,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAyClC"}
|
package/dist/keyed.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as MutableHashMap from '@effect/data/MutableHashMap';
|
|
2
2
|
import * as Option from '@effect/data/Option';
|
|
3
3
|
import * as ReadonlyArray from '@effect/data/ReadonlyArray';
|
|
4
|
-
import * as Equivalence from '@effect/data/typeclass/Equivalence';
|
|
5
4
|
import * as Effect from '@effect/io/Effect';
|
|
6
5
|
import * as Fiber from '@effect/io/Fiber';
|
|
7
|
-
import fastDeepEqual from 'fast-deep-equal';
|
|
8
6
|
import { Fx, Sink } from './Fx.js';
|
|
9
7
|
import { RefSubject } from './RefSubject.js';
|
|
10
8
|
import { makeHoldSubject } from './Subject.js';
|
|
@@ -12,68 +10,104 @@ import { withScopedFork } from './helpers.js';
|
|
|
12
10
|
export function keyed(fx, f, getKey) {
|
|
13
11
|
return Fx((sink) => withScopedFork((fork) => Effect.gen(function* ($) {
|
|
14
12
|
const state = createKeyedState();
|
|
15
|
-
const eq = Equivalence.make((x, y) => fastDeepEqual(getKey(x), getKey(y)));
|
|
16
|
-
const difference = ReadonlyArray.difference(eq);
|
|
17
|
-
const intersection = ReadonlyArray.intersection(eq);
|
|
18
13
|
const emit = emitWhenReady(state, getKey);
|
|
19
14
|
// Let output emit to the sink
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
yield* $(fx.run(Sink((as) => updateState({
|
|
15
|
+
yield* $(fork(state.output.run(sink)));
|
|
16
|
+
const params = {
|
|
23
17
|
state,
|
|
24
|
-
updated: as,
|
|
25
18
|
getKey,
|
|
26
19
|
f,
|
|
27
20
|
fork,
|
|
28
|
-
difference,
|
|
29
|
-
intersection,
|
|
30
21
|
emit,
|
|
31
22
|
error: sink.error,
|
|
23
|
+
};
|
|
24
|
+
// Listen to the input and update the state
|
|
25
|
+
yield* $(fx.run(Sink((updated) => updateState({
|
|
26
|
+
...params,
|
|
27
|
+
updated,
|
|
32
28
|
}), sink.error)));
|
|
33
|
-
yield* $(endAll(state));
|
|
34
29
|
// When the source stream ends we wait for the remaining fibers to end
|
|
35
30
|
yield* $(Fiber.joinAll(Array.from(state.fibers).map((x) => x[1])));
|
|
36
|
-
//
|
|
37
|
-
yield* $(
|
|
31
|
+
// Send end signals to all Fx listening to subjects to allow finalization
|
|
32
|
+
yield* $(endAll(state));
|
|
38
33
|
})));
|
|
39
34
|
}
|
|
40
35
|
function createKeyedState() {
|
|
41
36
|
return {
|
|
42
37
|
previous: [],
|
|
43
|
-
|
|
38
|
+
previousKeys: new Set(),
|
|
44
39
|
subjects: MutableHashMap.empty(),
|
|
45
40
|
fibers: MutableHashMap.empty(),
|
|
46
41
|
values: MutableHashMap.empty(),
|
|
47
42
|
output: makeHoldSubject(),
|
|
48
43
|
};
|
|
49
44
|
}
|
|
50
|
-
function updateState(
|
|
45
|
+
function updateState(params) {
|
|
46
|
+
const { state, updated, emit, getKey } = params;
|
|
51
47
|
return Effect.gen(function* ($) {
|
|
52
|
-
const added =
|
|
53
|
-
const removed = difference(state.previous, updated);
|
|
54
|
-
const unchanged = intersection(updated, state.previous);
|
|
55
|
-
state.previous = updated;
|
|
48
|
+
const { added, removed, unchanged } = diffValues(state, updated, getKey);
|
|
56
49
|
// Remove values that are no longer in the stream
|
|
57
|
-
|
|
50
|
+
if (removed.length > 0) {
|
|
51
|
+
yield* $(Effect.forEachDiscard(removed, (key) => removeValue(state, key)));
|
|
52
|
+
}
|
|
58
53
|
// Add values that are new to the stream
|
|
59
|
-
|
|
54
|
+
if (added.length > 0) {
|
|
55
|
+
yield* $(Effect.forEachDiscard(added, (value) => addValue({ ...params, value })));
|
|
56
|
+
}
|
|
60
57
|
// Update values that are still in the stream
|
|
61
|
-
|
|
58
|
+
if (unchanged.length > 0) {
|
|
59
|
+
yield* $(Effect.forEachDiscard(unchanged, (value) => updateValue(state, value, getKey)));
|
|
60
|
+
}
|
|
62
61
|
// If nothing was added, emit the current values
|
|
63
62
|
if (added.length === 0) {
|
|
64
63
|
yield* $(emit);
|
|
65
64
|
}
|
|
66
65
|
});
|
|
67
66
|
}
|
|
68
|
-
function
|
|
69
|
-
|
|
67
|
+
function diffValues(state, updated, getKey) {
|
|
68
|
+
const previousKeys = state.previousKeys;
|
|
69
|
+
const keys = new Set(updated.map(getKey));
|
|
70
|
+
state.previous = updated;
|
|
71
|
+
state.previousKeys = keys;
|
|
72
|
+
if (previousKeys.size === 0) {
|
|
73
|
+
return {
|
|
74
|
+
added: updated,
|
|
75
|
+
unchanged: [],
|
|
76
|
+
removed: [],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const added = [];
|
|
80
|
+
const unchanged = [];
|
|
81
|
+
const removed = [];
|
|
82
|
+
for (let i = 0; i < updated.length; ++i) {
|
|
83
|
+
const value = updated[i];
|
|
70
84
|
const key = getKey(value);
|
|
85
|
+
if (previousKeys.has(key)) {
|
|
86
|
+
unchanged.push(value);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
added.push(value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
previousKeys.forEach((k) => {
|
|
93
|
+
if (!keys.has(k)) {
|
|
94
|
+
removed.push(k);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
added,
|
|
99
|
+
unchanged,
|
|
100
|
+
removed,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function removeValue(state, key) {
|
|
104
|
+
return Effect.gen(function* ($) {
|
|
71
105
|
const subject = MutableHashMap.get(state.subjects, key);
|
|
72
106
|
if (Option.isSome(subject))
|
|
73
|
-
yield* $(subject.value.end());
|
|
107
|
+
yield* $(Effect.fork(subject.value.end()));
|
|
74
108
|
const fiber = MutableHashMap.get(state.fibers, key);
|
|
75
109
|
if (Option.isSome(fiber))
|
|
76
|
-
yield* $(Fiber.
|
|
110
|
+
yield* $(Fiber.interruptFork(fiber.value));
|
|
77
111
|
MutableHashMap.remove(state.values, key);
|
|
78
112
|
MutableHashMap.remove(state.subjects, key);
|
|
79
113
|
MutableHashMap.remove(state.fibers, key);
|
|
@@ -103,6 +137,10 @@ function updateValue(state, value, getKey) {
|
|
|
103
137
|
}
|
|
104
138
|
function emitWhenReady(state, getKey) {
|
|
105
139
|
return Effect.suspend(() => {
|
|
140
|
+
// Fast path: if we don't have enough values, don't emit
|
|
141
|
+
if (MutableHashMap.size(state.values) !== state.previous.length) {
|
|
142
|
+
return Effect.unit();
|
|
143
|
+
}
|
|
106
144
|
const values = ReadonlyArray.filterMap(state.previous, (value) => MutableHashMap.get(state.values, getKey(value)));
|
|
107
145
|
// When all of the values have resolved at least once, emit the output
|
|
108
146
|
if (values.length === state.previous.length) {
|
package/dist/keyed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed.js","sourceRoot":"","sources":["../src/keyed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"keyed.js","sourceRoot":"","sources":["../src/keyed.ts"],"names":[],"mappings":"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"}
|