import type { Recursive } from "@tsplus/stdlib/prelude/Recursive/definition" /** * Use a `Folder`, an initial value `Z` and a `Recursive.FoldDownFn` * function to perform a breadth-first reduction of a `Recursive` to a summary value `Z`. * * @tsplus static Recursive/Aspects foldDown * @tsplus pipeable Recursive foldDown */ export function foldDown( F: Foldable, z: Z, f: Recursive.FoldDownFn ) { return (self: Recursive): Z => { const next = f(z, self) const iter = (z0: Z, r: Recursive) => r.foldDown(F, z0, f) return pipe( self.caseValue, F.reduce(next, iter) ) } }