import { Scope } from "./abstractions" import { transform, Transformer, UnaryTransformOp, UnaryTransformOpScoped, } from "./transform" export type TypeGuard = (value: A) => value is B export type Predicate = (value: A) => boolean export function filter( fn: TypeGuard ): UnaryTransformOp export function filter(fn: Predicate): UnaryTransformOp export function filter( fn: TypeGuard, scope: Scope ): UnaryTransformOpScoped export function filter( fn: Predicate, scope: Scope ): UnaryTransformOpScoped export function filter(fn: Predicate, scope?: Scope): any { return transform(["filter", [fn]], filterT(fn), scope as Scope) } function filterT(fn: Predicate): Transformer { return { changes: (subscribe) => (onValue, onEnd) => subscribe((value) => { if (fn(value)) { onValue(value) } }, onEnd), init: (value: A) => { if (!fn(value)) { console.error("Initial value", value, "not matching filter", fn) throw Error(`Initial value not matching filter`) } return value }, } }