type Left = { tag: "left"; value: T }; type Right = { tag: "right"; value: T }; export type Either = Left | Right; export function left (value: T): Left { return {tag: "left", value: value} } export function right (value: T): Right { return {tag: "right", value: value} } export function match (input: Either, left: (l: L) => T, right: (right: R) => T): T { switch(input.tag) { case "left": return left(input.value); case "right": return right(input.value); } }