import { Actual } from "base/Actual"; import { Message } from "base/Message"; import { ConstructorType } from "types/ConstructorType"; import { MaybeMessage, MessageType } from "types/MessageType"; /** * Filters values from the source message based on a predicate function, * optionally providing a default value when the predicate fails. */ export function Filtered( base: MaybeMessage, predicate: ConstructorType<[T], boolean>, defaultValue?: T, ): MessageType { const $base = Actual(base); return Message(function FilteredImpl(resolve, reject) { $base.catch(reject); $base.then(function filteredBaseSub(v) { if (predicate(v)) { resolve(v); } else if (defaultValue !== undefined) { resolve(defaultValue); } }); }); }