import { N, B } from './baseType'; interface BaseChainElement { value: T; next: BaseChainElement | null; } interface BaseChain { readonly capacity: N; head: BaseChainElement | null; toArray: () => T[]; isValidRange: (p: N) => B; } interface SingleChainElement { value: T; position: N; next: SingleChainElementOrNull; } declare type SingleChainElementOrNull = SingleChainElement | null; interface SingleChain extends BaseChain { head: SingleChainElementOrNull; length: N; createNode: (v: T, p: N) => SingleChainElement; append: (p: T) => Error | N; insert: (p: T, position: N) => B; removeAt: (position: N) => T | undefined; reverseSelf: () => void; reverse: () => SingleChain; clear: () => void; setPosition: (from: N) => void; slice: (from: N, to: N) => void; } interface DoublyChainElement { value: T; position: N; next: DoublyChainElement | null; prev: DoublyChainElement | null; } interface IDoublyChain { head: DoublyChainElement | null; tail: DoublyChainElement | null; length: N; createNode: (v: T, p: N) => DoublyChainElement; append: (p: T) => Error | N; insert: (v: T, p: N) => B; removeAt: (p: N) => T | undefined; toArray: () => T[]; clear: () => void; setPosition: (from: N) => void; } interface SingleCircleChainElement { value: T; position: N; next: SingleCircleChainElement | null; } interface SingleCircleChain extends Pick, 'length' | 'createNode' | 'append' | 'insert' | 'removeAt' | 'slice'> { head: SingleCircleChainElement | null; tail: SingleCircleChainElement | null; } interface DoublyCircleChainElement { value: T; position: N; next: DoublyCircleChainElement | null; prev: DoublyCircleChainElement | null; } interface DoublyCircleChain { createNode: (v: T, p: N) => DoublyCircleChainElement; append: (v: T) => Error | N; insert: (v: T, p: N) => B; removeAt: (p: N) => T | undefined; } export { BaseChainElement, BaseChain, SingleChainElement, SingleChainElementOrNull, SingleChain, DoublyChainElement, IDoublyChain, SingleCircleChainElement, SingleCircleChain, DoublyCircleChainElement, DoublyCircleChain, };