import type { Universe } from '@ephox/boss'; import type { Optional } from '@ephox/katamari'; import * as Seeker from '../../gather/Seeker'; import { advance, backtrack, go, sidestep } from '../../gather/Walker'; import { Walkers } from '../../gather/Walkers'; import type { Direction, Successor, Transition, Traverse } from '../data/Types'; const isLeaf = (universe: Universe) => (element: E) => universe.property().children(element).length === 0; type BeforeApi = (universe: Universe, item: E, isRoot: (e: E) => boolean) => Optional; const before: BeforeApi = (universe, item, isRoot) => { return seekLeft(universe, item, isLeaf(universe), isRoot); }; type AfterApi = (universe: Universe, item: E, isRoot: (e: E) => boolean) => Optional; const after: AfterApi = (universe, item, isRoot) => { return seekRight(universe, item, isLeaf(universe), isRoot); }; type SeekLeftApi = (universe: Universe, item: E, predicate: (e: E) => boolean, isRoot: (e: E) => boolean) => Optional; const seekLeft: SeekLeftApi = Seeker.left; type SeekRightApi = (universe: Universe, item: E, predicate: (e: E) => boolean, isRoot: (e: E) => boolean) => Optional; const seekRight: SeekRightApi = Seeker.right; type WalkersApi = () => { left: () => Direction; right: () => Direction }; const walkers: WalkersApi = () => ({ left: Walkers.left, right: Walkers.right }); type WalkApi = (universe: Universe, item: E, mode: Transition, direction: Direction, rules?: Successor[]) => Optional>; const walk: WalkApi = go; export { before, after, seekLeft, seekRight, walkers, walk, // These have to be direct references. backtrack, sidestep, advance };