Skip to content

Commit

Permalink
feat: add skip & take
Browse files Browse the repository at this point in the history
  • Loading branch information
rokashkovvd committed Oct 11, 2024
1 parent 150c823 commit 80416fc
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
55 changes: 55 additions & 0 deletions src/skip/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import {
Event,
Store,
Unit,
combine,
createEvent,
createStore,
is,
sample,
} from 'effector';

export function skip<T>({
clock,
count,
reset,
}: {
clock?: Unit<T>;
count: Store<number> | number;
reset?: Unit<T>;
}): Event<T> {
const $count = is.store(count) ? count : createStore(count);

const $skipped = createStore(0);

const $canTrigger = combine(
[$skipped, $count],
([skipped, count]) => skipped >= count,
);

clock = is.unit(clock) ? clock : createEvent();

reset = is.unit(reset) ? reset : createEvent();

const event = sample({
clock,
source: $skipped,
filter: $canTrigger,
fn: (_, params) => params,
});

sample({
clock,
source: $skipped,
filter: $canTrigger.map((canTrigger) => !canTrigger),
fn: (skipped) => skipped + 1,
target: $skipped,
});

sample({
clock: [$count, reset],
target: $skipped.reinit,
});

return event;
}
52 changes: 52 additions & 0 deletions src/take/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import {
Event,
Store,
Unit,
combine,
createEvent,
createStore,
is,
sample,
} from 'effector';

export function skip<T>({
clock,
count,
reset,
}: {
clock: Unit<T>;
count: Store<number> | number;
reset?: Unit<T>;
}): Event<T> {
const $count = is.store(count) ? count : createStore(count);

const $taken = createStore(0);

const $canTrigger = combine([$taken, $count], ([taken, count]) => taken >= count);

clock = is.unit(clock) ? clock : createEvent();

reset = is.unit(reset) ? reset : createEvent();

const event = sample({
clock,
source: $taken,
filter: $canTrigger,
fn: (_, params) => params,
});

sample({
clock,
source: $taken,
filter: $canTrigger.map((canTrigger) => !canTrigger),
fn: (taken) => taken + 1,
target: $taken,
});

sample({
clock: [$count, reset],
target: $taken.reinit,
});

return event;
}

0 comments on commit 80416fc

Please sign in to comment.