import { IterableActivity, Source, isSource } from "./activity"; export type FilterCallback = (value: T, index: number) => boolean; function filterGen(callbackFn: FilterCallback): IterableActivity { return function* (source: Source) { let i = -1; for (const item of source) { if (callbackFn(item, ++i)) { yield item; } } }; } export function filter(callbackFn: FilterCallback): IterableActivity; export function filter(source: Source, callbackFn: FilterCallback): IterableIterator; export function filter(s_or_cb: Source | FilterCallback, callbackFn?: FilterCallback): IterableActivity | IterableIterator { return isSource(s_or_cb) ? filterGen(callbackFn!)(s_or_cb) : filterGen(s_or_cb); }