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
},
}
}