import { Adt, Fun } from '@ephox/katamari'; import type { SugarElement } from '../node/SugarElement'; export interface Situ { fold: ( before: (element: SugarElement) => U, on: (element: SugarElement, offset: number) => U, after: (element: SugarElement) => U ) => U; match: (branches: { before: (element: SugarElement) => U; on: (element: SugarElement, offset: number) => U; after: (element: SugarElement) => U; }) => U; log: (label: string) => void; } const adt: { before: (element: SugarElement) => Situ; on: (element: SugarElement, offset: number) => Situ; after: (element: SugarElement) => Situ; } = Adt.generate([ { before: [ 'element' ] }, { on: [ 'element', 'offset' ] }, { after: [ 'element' ] } ]); // Probably don't need this given that we now have "match" const cata = (subject: Situ, onBefore: (element: SugarElement) => U, onOn: (element: SugarElement, offset: number) => U, onAfter: (element: SugarElement) => U): U => subject.fold(onBefore, onOn, onAfter); const getStart = (situ: Situ): SugarElement => situ.fold(Fun.identity, Fun.identity, Fun.identity); const before = adt.before; const on = adt.on; const after = adt.after; // tslint:disable-next-line:variable-name export const Situ = { before, on, after, cata, getStart };