Skip to content

Commit 23c8f66

Browse files
feat(overmind): add branch operator
1 parent f0f66db commit 23c8f66

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

packages/node_modules/overmind/src/operators.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
Overmind,
33
pipe,
4+
branch,
45
filter,
56
fork,
67
when,
@@ -16,6 +17,39 @@ import {
1617
import { merge } from './config'
1718

1819
describe('OPERATORS', () => {
20+
test('branch - passes input as output', async () => {
21+
expect.assertions(1)
22+
23+
const state = {
24+
foo: 'bar',
25+
}
26+
27+
const actions = {
28+
test: pipe(
29+
branch((_, value: string) => value.toUpperCase()),
30+
({ state }: Context, value) => {
31+
state.foo = value
32+
}
33+
),
34+
}
35+
36+
const config = {
37+
state,
38+
actions,
39+
}
40+
41+
type Context = IContext<{
42+
state: typeof state
43+
actions: typeof actions
44+
}>
45+
46+
const overmind = new Overmind(config)
47+
48+
await overmind.actions.test('foo')
49+
50+
expect(overmind.state.foo).toBe('foo')
51+
})
52+
1953
test('action - return value', async () => {
2054
expect.assertions(1)
2155

packages/node_modules/overmind/src/operators.ts

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,118 @@ export function pipe(...operators) {
113113
return instance
114114
}
115115

116+
export function branch<AI, AO = AI>(
117+
a: OperatorContextFunction<AI, AO>
118+
): IOperator<AI, AI>
119+
export function branch<A, B, C>(
120+
a: OperatorContextFunction<A, B>,
121+
b: OperatorContextFunction<B, C>
122+
): IOperator<A, A>
123+
export function branch<A, B, C, D>(
124+
a: OperatorContextFunction<A, B>,
125+
b: OperatorContextFunction<B, C>,
126+
c: OperatorContextFunction<C, D>
127+
): IOperator<A, A>
128+
export function branch<A, B, C, D, E>(
129+
a: OperatorContextFunction<A, B>,
130+
b: OperatorContextFunction<B, C>,
131+
c: OperatorContextFunction<C, D>,
132+
d: OperatorContextFunction<D, E>
133+
): IOperator<A, A>
134+
export function branch<A, B, C, D, E, F>(
135+
a: OperatorContextFunction<A, B>,
136+
b: OperatorContextFunction<B, C>,
137+
c: OperatorContextFunction<C, D>,
138+
d: OperatorContextFunction<D, E>,
139+
e: OperatorContextFunction<E, F>
140+
): IOperator<A, A>
141+
export function branch<A, B, C, D, E, F, G>(
142+
a: OperatorContextFunction<A, B>,
143+
b: OperatorContextFunction<B, C>,
144+
c: OperatorContextFunction<C, D>,
145+
d: OperatorContextFunction<D, E>,
146+
e: OperatorContextFunction<E, F>,
147+
f: OperatorContextFunction<F, G>
148+
): IOperator<A, A>
149+
export function branch<A, B, C, D, E, F, G, H>(
150+
a: OperatorContextFunction<A, B>,
151+
b: OperatorContextFunction<B, C>,
152+
c: OperatorContextFunction<C, D>,
153+
d: OperatorContextFunction<D, E>,
154+
e: OperatorContextFunction<E, F>,
155+
f: OperatorContextFunction<F, G>,
156+
g: OperatorContextFunction<G, H>
157+
): IOperator<A, A>
158+
export function branch<A, B, C, D, E, F, G, H, I>(
159+
a: OperatorContextFunction<A, B>,
160+
b: OperatorContextFunction<B, C>,
161+
c: OperatorContextFunction<C, D>,
162+
d: OperatorContextFunction<D, E>,
163+
e: OperatorContextFunction<E, F>,
164+
f: OperatorContextFunction<F, G>,
165+
g: OperatorContextFunction<G, H>,
166+
h: OperatorContextFunction<H, I>
167+
): IOperator<A, A>
168+
export function branch<A, B, C, D, E, F, G, H, I, J>(
169+
a: OperatorContextFunction<A, B>,
170+
b: OperatorContextFunction<B, C>,
171+
c: OperatorContextFunction<C, D>,
172+
d: OperatorContextFunction<D, E>,
173+
e: OperatorContextFunction<E, F>,
174+
f: OperatorContextFunction<F, G>,
175+
g: OperatorContextFunction<G, H>,
176+
h: OperatorContextFunction<H, I>,
177+
i: OperatorContextFunction<I, J>
178+
): IOperator<A, A>
179+
export function branch<A, B, C, D, E, F, G, H, I, J, K>(
180+
a: OperatorContextFunction<A, B>,
181+
b: OperatorContextFunction<B, C>,
182+
c: OperatorContextFunction<C, D>,
183+
d: OperatorContextFunction<D, E>,
184+
e: OperatorContextFunction<E, F>,
185+
f: OperatorContextFunction<F, G>,
186+
g: OperatorContextFunction<G, H>,
187+
h: OperatorContextFunction<H, I>,
188+
i: OperatorContextFunction<I, J>,
189+
j: OperatorContextFunction<J, K>
190+
): IOperator<A, A>
191+
export function branch(...operators) {
192+
const instance = (err, context, next, final = next) => {
193+
if (err) next(err, context)
194+
else {
195+
let operatorIndex = 0
196+
197+
const run = (operatorErr, operatorContext) => {
198+
const operator = operators[operatorIndex++]
199+
const operatorToRun = operator
200+
? operator[utils.IS_OPERATOR]
201+
? operator
202+
: action(operator)
203+
: (err, finalContext, finalNext, finalFinal) => {
204+
next(
205+
err,
206+
{
207+
...finalContext,
208+
value: context.value,
209+
},
210+
finalNext,
211+
finalFinal
212+
)
213+
}
214+
try {
215+
operatorToRun(operatorErr, operatorContext, run, final)
216+
} catch (operatorError) {
217+
operatorToRun(operatorErr, operatorContext, run, final)
218+
}
219+
}
220+
221+
run(null, context)
222+
}
223+
}
224+
instance[utils.IS_OPERATOR] = true
225+
return instance
226+
}
227+
116228
/*
117229
OPERATORS
118230
*/

0 commit comments

Comments
 (0)