import {teeAsync, teePushableAsync} from "./monads"; import {type Pushable} from "it-pushable"; export type Clonable = T &{ source: T clone(this:Clonable): T; } export function cloneable(source: AsyncIterable):Clonable> { const stream = { source: source , ...source, clone(this:Clonable>) { const [clone1, clone2] = teeAsync(this.source); this.source = clone2 return clone1; } } stream.clone = stream.clone.bind(stream); return stream; } export type PushableCloneable = { source: Pushable; clone(this:PushableCloneable): AsyncIterable; push(value: T): Pushable; } export function clonePushable(source: Pushable):PushableCloneable { const stream = { source: source , ...source, clone(this) { const [clone1, clone2] = teePushableAsync(this.source); this.source = clone2 return clone1; }, push: (value: T) => { return source.push(value); } } satisfies PushableCloneable stream.clone = stream.clone.bind(stream); return stream; }