import type { Operator } from "../types/Operator.ts";
function encapsulateOpState<T, U>( statefulFλOp: Operator.fλ.Stateful<T, U>): Operator.fλ.Stateless<T, U> {
let state: U = statefulFλOp[1];
return (data, registerSideEffect) => {
const opResult = statefulFλOp[0](data, state, registerSideEffect);
if (opResult !== null) { registerSideEffect(() => state = opResult[0]) }
return opResult;
};
}
function statelessOpToStatelessFλ<T, U>(op: Operator.Stateless<T, U>): Operator.fλ.Stateless<T, U> { return (data, registerSideEffect) => {
const opResult: any = (op as Operator.fλ.Stateless<T, U>)(data, registerSideEffect);
return ( opResult instanceof Object && !("input" in opResult) && opResult.length === 1 ) ? opResult : !!opResult ? [data] : null;
}};
export function convertOperatorToStatelessFλ<T, U>( op: Operator<T, U>): Operator.fλ.Stateless<T, U> { return typeof op !== "function" ? encapsulateOpState(op) : statelessOpToStatelessFλ(op);}