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);
}