Skip to content

Commit a68f6eb

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

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

src/skip/index.ts

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

src/take/index.ts

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

0 commit comments

Comments
 (0)