import {HttpMessage} from "@http4t/core/contract"; import {MessageLens, RoutingResult} from "../lenses"; import {failure, isFailure, isSuccess} from "@http4t/result"; export class UnionLens implements MessageLens { constructor( private a: MessageLens, private b: MessageLens, private isA: (value: A | B) => value is A ) { } async get(from: TMessage): Promise> { const a = await this.a.get(from); if (isSuccess(a)) return a; const b = await this.b.get(from); if (isFailure(b)) return failure({...b.error, problems: [...a.error.problems, ...b.error.problems]}) return b; } async set(into: SetInto, value: A | B): Promise { if (this.isA(value)) return this.a.set(into, value) return this.b.set(into, value); } } export function union ( a: MessageLens, b: MessageLens, isA: (value: A | B) => value is A) : MessageLens { return new UnionLens(a, b, isA) }