import { Adt } from '@ephox/katamari'; export interface ZonePosition { fold: ( aboveView: (item: E) => T, inView: (item: E) => T, belowView: (item: E) => T ) => T; match: (branches: { aboveView: (item: E) => T; inView: (item: E) => T; belowView: (item: E) => T; }) => T; log: (label: string) => void; } const adt: { aboveView: (item: E) => ZonePosition; inView: (item: E) => ZonePosition; belowView: (item: E) => ZonePosition; } = Adt.generate([ { aboveView: [ 'item' ] }, { inView: [ 'item' ] }, { belowView: [ 'item' ] } ]); const cata = (subject: ZonePosition, onAbove: (item: E) => T, onIn: (item: E) => T, onBelow: (item: E) => T): T => { return subject.fold(onAbove, onIn, onBelow); }; export const ZonePosition = { ...adt, cata };