import { convertOperatorToStatelessFλ } from "./convertOperatorToStatelessFLambda"; import { id } from "tsafe/id"; import type { Operator } from "../types/Operator"; function f_o_g( op1: Operator, op2: Operator ): Operator.fλ.Stateless { const opAtoB = convertOperatorToStatelessFλ(op1); const opBtoC = convertOperatorToStatelessFλ(op2); return id>( (dataA, registerSideEffect) => { const resultB = opAtoB(dataA, registerSideEffect); if( !resultB ){ return null; } const [dataB] = resultB; const resultC = opBtoC(dataB, registerSideEffect); if( !resultC ){ return resultC; } return [resultC[0]]; } ); } export function compose( op1: Operator.fλ, op2: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: (data: B) => data is C, ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: (data: B) => boolean, ): Operator.fλ.Stateless; export function compose( op1: (data: A) => data is B, op2: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: (data: A) => boolean, op2: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: (data: A) => data is B, op2: (data: B) => data is C, ): Operator.fλ.Stateless; export function compose( op1: (data: A) => data is B, op2: (data: B) => boolean, ): Operator.fλ.Stateless; export function compose( op1: (data: A) => boolean, op2: (data: A) => data is B ): Operator.fλ.Stateless; export function compose( op1: (data: A) => boolean, op2: (data: A) => boolean, ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: Operator.fλ, op3: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: Operator.fλ, op3: Operator.fλ, op4: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: Operator.fλ, op3: Operator.fλ, op4: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: Operator.fλ, op2: Operator.fλ, op3: Operator.fλ, op4: Operator.fλ, op5: Operator.fλ ): Operator.fλ.Stateless; export function compose( op1: Operator, op2: Operator ): Operator.fλ.Stateless; export function compose( op1: Operator, op2: Operator, op3: Operator ): Operator.fλ.Stateless; export function compose( op1: Operator, op2: Operator, op3: Operator, op4: Operator, ): Operator.fλ.Stateless; export function compose( op1: Operator, op2: Operator, op3: Operator, op4: Operator, op5: Operator ): Operator.fλ.Stateless; export function compose( ...ops: [ Operator, ...Operator[] ] ): Operator.fλ.Stateless; export function compose( ...ops: [ Operator, ...Operator[] ] ): Operator.fλ.Stateless { if (ops.length === 1) { const [op] = ops; return convertOperatorToStatelessFλ(op); } const [op1, op2, ...rest] = ops; const op1_o_op2 = f_o_g(op1, op2); if (rest.length === 0) { return op1_o_op2; } return compose(op1_o_op2, ...rest); }