import { Adt } from '@ephox/katamari'; type NoneHandler = () => U; type StartHandler = (element: E) => U; type MiddleHandler = (before: E, after: E) => U; type EndHandler = (element: E) => U; export interface SplitPosition { fold: ( onNone: NoneHandler, onStart: StartHandler, onMiddle: MiddleHandler, onEnd: EndHandler ) => U; match: (branches: { none: NoneHandler; start: StartHandler; middle: MiddleHandler; end: EndHandler; }) => U; log: (label: string) => void; } const adt: { none: () => SplitPosition; start: (element: E) => SplitPosition; middle: (before: E, after: E) => SplitPosition; end: (element: E) => SplitPosition; } = Adt.generate([ { none: [] }, { start: [ 'element' ] }, { middle: [ 'before', 'after' ] }, { end: [ 'element' ] } ]); export const SplitPosition = { none: adt.none, start: adt.start, middle: adt.middle, end: adt.end };