Skip to content

Commit 80416fc

Browse files
committed
feat: add skip & take
1 parent 150c823 commit 80416fc

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

src/skip/index.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import {
2+
Event,
3+
Store,
4+
Unit,
5+
combine,
6+
createEvent,
7+
createStore,
8+
is,
9+
sample,
10+
} from 'effector';
11+
12+
export function skip<T>({
13+
clock,
14+
count,
15+
reset,
16+
}: {
17+
clock?: Unit<T>;
18+
count: Store<number> | number;
19+
reset?: Unit<T>;
20+
}): Event<T> {
21+
const $count = is.store(count) ? count : createStore(count);
22+
23+
const $skipped = createStore(0);
24+
25+
const $canTrigger = combine(
26+
[$skipped, $count],
27+
([skipped, count]) => skipped >= count,
28+
);
29+
30+
clock = is.unit(clock) ? clock : createEvent();
31+
32+
reset = is.unit(reset) ? reset : createEvent();
33+
34+
const event = sample({
35+
clock,
36+
source: $skipped,
37+
filter: $canTrigger,
38+
fn: (_, params) => params,
39+
});
40+
41+
sample({
42+
clock,
43+
source: $skipped,
44+
filter: $canTrigger.map((canTrigger) => !canTrigger),
45+
fn: (skipped) => skipped + 1,
46+
target: $skipped,
47+
});
48+
49+
sample({
50+
clock: [$count, reset],
51+
target: $skipped.reinit,
52+
});
53+
54+
return event;
55+
}

src/take/index.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
Event,
3+
Store,
4+
Unit,
5+
combine,
6+
createEvent,
7+
createStore,
8+
is,
9+
sample,
10+
} from 'effector';
11+
12+
export function skip<T>({
13+
clock,
14+
count,
15+
reset,
16+
}: {
17+
clock: Unit<T>;
18+
count: Store<number> | number;
19+
reset?: Unit<T>;
20+
}): Event<T> {
21+
const $count = is.store(count) ? count : createStore(count);
22+
23+
const $taken = createStore(0);
24+
25+
const $canTrigger = combine([$taken, $count], ([taken, count]) => taken >= count);
26+
27+
clock = is.unit(clock) ? clock : createEvent();
28+
29+
reset = is.unit(reset) ? reset : createEvent();
30+
31+
const event = sample({
32+
clock,
33+
source: $taken,
34+
filter: $canTrigger,
35+
fn: (_, params) => params,
36+
});
37+
38+
sample({
39+
clock,
40+
source: $taken,
41+
filter: $canTrigger.map((canTrigger) => !canTrigger),
42+
fn: (taken) => taken + 1,
43+
target: $taken,
44+
});
45+
46+
sample({
47+
clock: [$count, reset],
48+
target: $taken.reinit,
49+
});
50+
51+
return event;
52+
}

0 commit comments

Comments
 (0)