import { Actual, MaybeMessage, Message, MessageType, Primitive, } from "silentium"; /** * Allows switching between left and right messages depending on condition * https://silentium.pw/article/branch/view */ export function Branch( _condition: MaybeMessage, _left: MaybeMessage, _right?: MaybeMessage, ) { const $condition = Actual(_condition); const $left = Actual(_left); const $right = Actual(_right); return Message(function BranchImpl(r) { const left = Primitive($left); let right: ReturnType>; if (_right !== undefined) { right = Primitive($right as MessageType); } $condition.then(function branchSub(v) { if (typeof v !== "boolean") { throw new Error("Branch received not boolean value"); } let result: Then | Else | null = null; if (v === true) { result = left.primitive(); } else if (right) { result = right.primitive(); } if (result !== null) { r(result); } }); }); }