import {HttpMessage} from "@http4t/core/contract"; import {MessageLens, RoutingResult} from "../lenses"; import {isSuccess} from "@http4t/result"; export class MapLens implements MessageLens { constructor(private readonly a: MessageLens, private readonly getter: (a: A) => Promise> | RoutingResult, private readonly setter: (b: B) => Promise | A) { } async get(from: TMessage): Promise> { const result = await this.a.get(from); return isSuccess(result) ? await this.getter(result.value) : result; } async set(into: SetInto, value: B): Promise { return this.a.set(into, await this.setter(value)); } } export function mapped( a: MessageLens, getter: (a: A) => Promise> | RoutingResult, setter: (b: B) => Promise | A): MessageLens { return new MapLens(a, getter, setter); }