import type { AnyElysia, MaybeArray } from 'elysia' import { createChain } from './internal/create-chain' import { Observable } from './internal/observable' import type { EdenLink, Operation } from './internal/operation' function asArray(value: TType | TType[]) { return Array.isArray(value) ? value : [value] } export type SplitLinkOptions = { /** */ condition: (operation: Operation) => boolean /** * The link(s) to execute next if {@link SplitLinkOptions.condition} function returns `true`. */ true: MaybeArray> /** * The link(s) to execute next if {@link SplitLinkOptions.condition} function returns `false`. */ false: MaybeArray> } export function splitLink( options: SplitLinkOptions, ): EdenLink { return (runtime) => { const linksIfTrue = asArray(options.true).map((link) => link(runtime)) const linksIfFalse = asArray(options.false).map((link) => link(runtime)) const linksByCondition = { true: linksIfTrue, false: linksIfFalse } return ({ operation }) => { return new Observable((observer) => { const condition = options.condition(operation) const links = linksByCondition[`${condition}`] return createChain({ operation, links }).subscribe(observer) }) } } }