ixfx
Version:
A framework for programming interactivity
872 lines (859 loc) • 37.4 kB
TypeScript
import { T as TreeNode, a as TraversableTree$1, S as SimplifiedNode, L as LabelledSingleValue, b as LabelledValue, c as LabelledNode, d as LabelledValues } from './Types-DI3Ag868.js';
import { I as IsEqual } from './IsEqual-CTTf-Oj9.js';
type DiffAnnotation<T> = {
/**
* In the case of changes, this is old value
*/
a: TraversableTree$1<T>;
/**
* In the case of changes, this is the new value
*/
b: TraversableTree$1<T>;
/**
* If true, this node's value has been modified
*/
valueChanged: boolean;
/**
* If true, one of the child values has changed
*/
childChanged: boolean;
/**
* List of new children
*/
added: Array<TraversableTree$1<T>>;
/**
* List of removed children
*/
removed: Array<TraversableTree$1<T>>;
};
type DiffNode<T> = TreeNode<DiffAnnotation<T>> & {
toString: () => string;
};
declare const compare$1: <T>(a: TraversableTree$1<T>, b: TraversableTree$1<T>, eq?: IsEqual<T>, parent?: DiffNode<T> | undefined) => DiffNode<T>;
/**
* Compares two nodes.
*
* By default uses `isEqualValueIgnoreOrder` to compare nodes. This means
* values of nodes will be compared, ignoring the order of fields.
* @param a
* @param b
* @param eq Comparison function. Uses `isEqualValueIgnoreOrder` by default.
* @returns Compare results
*/
declare const compare: <T>(a: TreeNode<T>, b: TreeNode<T>, eq?: IsEqual<T>) => DiffNode<T>;
/**
* Converts `TreeNode` to `SimplifiedNode`, removing the 'parent' fields.
* This can be useful because if you have the whole tree, the parent field
* is redundant and because it makes circular references can make dumping to console etc more troublesome.
*
* Recursive: strips parentage of all children and so on too.
* @param node
* @returns
*/
declare const stripParentage: <T>(node: TreeNode<T>) => SimplifiedNode<T>;
/**
* Wraps a {@link TreeNode} for a more object-oriented means of access.
*/
type WrappedNode<T> = TraversableTree$1<T> & {
/**
* Underlying Node
*/
wraps: TreeNode<T>;
/**
* Gets value, if defined
* @returns Value of Node
*/
getValue: () => T | undefined;
/**
* Remove node and its children from tree
* @returns
*/
remove: () => void;
/**
* Adds a child node
* @param child
* @returns
*/
add: (child: WrappedNode<T> | TreeNode<T>) => WrappedNode<T>;
/**
* Adds a new child node, with `value` as its value
* @param value
* @returns
*/
addValue: (value: T) => WrappedNode<T>;
/**
* Returns _true_ if `child` is an immediate child of this node
* @param child
* @returns
*/
hasChild: (child: WrappedNode<T> | TreeNode<T>) => boolean;
queryValue: (value: T) => IterableIterator<WrappedNode<T>>;
/**
* Returns _true_ if `child` is contained any any descendant
* @param child
* @returns
*/
hasAnyChild: (child: WrappedNode<T> | TreeNode<T>) => boolean;
/**
* Returns _true_ if `parent` is the immediate parent for this node
* @param parent
* @returns
*/
hasParent: (parent: WrappedNode<T> | TreeNode<T>) => boolean;
/**
* Returns _true_ if `parent` is the immediate or ancestor parent for this node
* @param parent
* @returns
*/
hasAnyParent: (parent: WrappedNode<T> | TreeNode<T>) => boolean;
};
/**
* Wraps node `n` for a more object-oriented means of access.
* It will wrap child nodes on demand. For this reason, WrappedNode object
* identity is not stable
* @param n Node to wrap
* @returns
*/
declare const wrap: <T>(n: TreeNode<T>) => WrappedNode<T>;
/**
* Removes `child` from the tree structure it is in.
* It removes `child` from its parent. Any sub-children of `child` still remain connected.
* @param child
* @returns
*/
declare const remove: <T>(child: TreeNode<T>) => void;
/**
* Depth-first iteration of the children of `node`
* @param node
* @returns
*/
declare function depthFirst$2<T>(node: TreeNode<T>): IterableIterator<TreeNode<T>>;
/**
* Breadth-first iteration of the children of `node`
* @param node
* @returns
*/
declare function breadthFirst$1<T>(node: TreeNode<T>): IterableIterator<TreeNode<T>>;
/**
* Validates the tree from `root` downwards.
* @param root
* @param seen
* @returns
*/
declare function treeTest<T>(root: TreeNode<T>, seen?: Array<TreeNode<T>>): [ok: boolean, msg: string, node: TreeNode<T>];
/**
* Throws an exception if `root` fails tree validation
* @param root
* @returns
*/
declare function throwTreeTest<T>(root: TreeNode<T>): void;
/**
* Iterate over direct children of `root`
* @param root
*/
declare function children$1<T>(root: TreeNode<T>): IterableIterator<TreeNode<T>>;
/**
* Iterate over all parents of `root`. First result is the immediate parent.
* @param root
*/
declare function parents$1<T>(root: TreeNode<T>): IterableIterator<TreeNode<T>>;
/**
* Returns the depth of `node`. A root node (ie. with no parents) has a depth of 0.
* @param node
* @returns
*/
declare function nodeDepth(node: TreeNode<any>): number;
declare const hasChild$1: <T>(child: TreeNode<T>, parent: TreeNode<T>) => boolean;
declare const findChildByValue$1: <T>(value: T, parent: TreeNode<T>, eq?: IsEqual<T>) => TreeNode<T> | undefined;
declare function queryByValue<T>(value: T, parent: TreeNode<T>, eq?: IsEqual<T>): IterableIterator<TreeNode<T>>;
/**
* Returns _true_ if `prospectiveChild` is some child node of `parent`,
* anywhere in the tree structure.
*
* Use {@link hasChild} to only check immediate children.
* @param prospectiveChild
* @param parent
* @returns
*/
declare const hasAnyChild$1: <T>(prospectiveChild: TreeNode<T>, parent: TreeNode<T>) => boolean;
declare const findAnyChildByValue$1: <T>(value: T, parent: TreeNode<T>, eq?: IsEqual<T>) => TreeNode<T> | undefined;
declare const getRoot: <T>(node: TreeNode<T>) => TreeNode<T>;
/**
* Returns _true_ if `prospectiveParent` is any ancestor
* parent of `child`.
*
* Use {@link hasParent} to only check immediate parent.
* @param child
* @param prospectiveParent
* @returns
*/
declare const hasAnyParent$1: <T>(child: TreeNode<T>, prospectiveParent: TreeNode<T>) => boolean;
/**
* Returns _true_ if `prospectiveParent` is the immediate
* parent of `child`.
*
* Use {@link hasAnyParent} to check for any ancestor parent.
* @param child
* @param prospectiveParent
* @returns
*/
declare const hasParent$1: <T>(child: TreeNode<T>, prospectiveParent: TreeNode<T>) => boolean;
/**
* Computes the maximum depth of the tree.
* That is, how many steps down from `node` it can go.
* If a tree is: root -> childA -> subChildB
* ```js
* // Yields 2, since there are at max two steps down from root
* computeMaxDepth(root);
* ```
* @param node
* @returns
*/
declare const computeMaxDepth: <T>(node: TreeNode<T>) => number;
declare const add: <T>(child: TreeNode<T>, parent: TreeNode<T>) => void;
declare const addValue: <T>(value: T | undefined, parent: TreeNode<T>) => TreeNode<T>;
/**
* Creates the root for a tree, with an optional `value`.
* Use {@link rootWrapped} if you want a more object-oriented mode of access.
* @param value
* @returns
*/
declare const root: <T>(value?: T | undefined) => TreeNode<T>;
declare const fromPlainObject: (value: Record<string, any>, label?: string, parent?: TreeNode<any>, seen?: Array<any>) => TreeNode<LabelledSingleValue<any>>;
/**
* Creates a tree, returning it as a {@link WrappedNode} for object-oriented access.
* Use {@link root} alternatively.
* @param value
* @returns
*/
declare const rootWrapped: <T>(value: T | undefined) => WrappedNode<T>;
declare const createNode: <T>(value: T | undefined, parent?: TreeNode<T> | undefined) => TreeNode<T>;
declare const childrenLength$1: <T>(node: TreeNode<T>) => number;
declare const value: <T>(node: TreeNode<T>) => T | undefined;
/**
* Projects `node` as a dynamic traversable.
* Dynamic in the sense that it creates the traversable project for nodes on demand.
* A consequence is that node identities are not stable.
* @param node
* @returns
*/
declare const asDynamicTraversable$1: <T>(node: TreeNode<T>) => TraversableTree$1<T>;
declare const setChildren: <T>(parent: TreeNode<T>, children: Array<TreeNode<T>>) => void;
declare const toStringDeep$2: <T>(node: TreeNode<T>, indent?: number) => string;
declare function followValue$1<T>(root: TreeNode<T>, continuePredicate: (nodeValue: T, depth: number) => boolean, depth?: number): IterableIterator<T | undefined>;
type TreeMutable_WrappedNode<T> = WrappedNode<T>;
declare const TreeMutable_add: typeof add;
declare const TreeMutable_addValue: typeof addValue;
declare const TreeMutable_compare: typeof compare;
declare const TreeMutable_computeMaxDepth: typeof computeMaxDepth;
declare const TreeMutable_createNode: typeof createNode;
declare const TreeMutable_fromPlainObject: typeof fromPlainObject;
declare const TreeMutable_getRoot: typeof getRoot;
declare const TreeMutable_nodeDepth: typeof nodeDepth;
declare const TreeMutable_queryByValue: typeof queryByValue;
declare const TreeMutable_remove: typeof remove;
declare const TreeMutable_root: typeof root;
declare const TreeMutable_rootWrapped: typeof rootWrapped;
declare const TreeMutable_setChildren: typeof setChildren;
declare const TreeMutable_stripParentage: typeof stripParentage;
declare const TreeMutable_throwTreeTest: typeof throwTreeTest;
declare const TreeMutable_treeTest: typeof treeTest;
declare const TreeMutable_value: typeof value;
declare const TreeMutable_wrap: typeof wrap;
declare namespace TreeMutable {
export { type TreeMutable_WrappedNode as WrappedNode, TreeMutable_add as add, TreeMutable_addValue as addValue, asDynamicTraversable$1 as asDynamicTraversable, breadthFirst$1 as breadthFirst, children$1 as children, childrenLength$1 as childrenLength, TreeMutable_compare as compare, TreeMutable_computeMaxDepth as computeMaxDepth, TreeMutable_createNode as createNode, depthFirst$2 as depthFirst, findAnyChildByValue$1 as findAnyChildByValue, findChildByValue$1 as findChildByValue, followValue$1 as followValue, TreeMutable_fromPlainObject as fromPlainObject, TreeMutable_getRoot as getRoot, hasAnyChild$1 as hasAnyChild, hasAnyParent$1 as hasAnyParent, hasChild$1 as hasChild, hasParent$1 as hasParent, TreeMutable_nodeDepth as nodeDepth, parents$1 as parents, TreeMutable_queryByValue as queryByValue, TreeMutable_remove as remove, TreeMutable_root as root, TreeMutable_rootWrapped as rootWrapped, TreeMutable_setChildren as setChildren, TreeMutable_stripParentage as stripParentage, TreeMutable_throwTreeTest as throwTreeTest, toStringDeep$2 as toStringDeep, TreeMutable_treeTest as treeTest, TreeMutable_value as value, TreeMutable_wrap as wrap };
}
/**
* Options for parsing a path
*/
type PathOpts$1 = Readonly<{
/**
* Separator for path, eg '.'
*/
separator: string;
/**
* If two values are stored at same path, what to do? Default: overwrite
* * overwrite: last-write wins
* * ignore: first-write wins
* * allow: allow multiple values
*/
duplicates: `overwrite` | `allow` | `ignore`;
}>;
/**
* Creates a wrapper for working with 'pathed' trees.
* An example is a filesystem.
*
* ```js
* const t = create();
* // Store a value. Path implies a structure of
* // c -> users -> admin
* // ...which is autoatically created
* t.add({x:10}, `c.users.admin`);
*
* t.add({x:20}, `c.users.guest`);
* // Tree will now be:
* // c-> users -> admin
* // -> guest
*
* t.getValue(`c.users.guest`); // { x:20 }
* ```
*
* By default only a single value can be stored at a path.
* Set options to allow this:
* ```js
* const t = create({ duplicates: `allow` });
* t.add({x:10}, `c.users.admin`);
* t.add({x:20}, `c.users.admin`);
* t.getValue(`c.users.admin`); // Throws an error because there are multiple values
* t.getValues(`c.users.admin`); // [ {x:10}, {x:20 } ]
* ```
* @param pathOpts
* @returns
*/
declare const create$1: <T>(pathOpts?: Partial<PathOpts$1>) => {
getRoot: () => TreeNode<LabelledValue<T>> | undefined;
add: (value: T, path: string) => void;
prettyPrint: () => string;
remove: (path: string) => boolean;
getValue: (path: string) => T | undefined;
getValues: (path: string) => Array<T>;
hasPath: (path: string) => boolean;
childrenLength: (path: string) => number;
getNode: (path: string) => LabelledNode<T> | undefined;
clearValues: (path: string) => boolean;
};
/**
* Adds a value by a string path, with '.' as a the default delimiter
* Automatically generates intermediate nodes.
*
* ```js
* const root = addValueByPath({}, 'c');
* addValueByPath({x:'blah'}, 'c.users.admin', root);
* ```
*
* Creates the structure:
* ```
* c value: { } label: c
* + users value: undefined label: users
* + admin value: { x: 'blah' } label: admin
* ```
*
* By default, multiple values under same key are overwritten, with the most recent winning.
* @param value
* @param path
* @param pathOpts
*/
declare const addValueByPath: <T>(value: T, path: string, node?: LabelledNode<T> | undefined, pathOpts?: Partial<PathOpts$1>) => LabelledNode<T>;
declare const removeByPath: <T>(path: string, root: LabelledNode<T>, pathOpts?: Partial<PathOpts$1>) => boolean;
declare const clearValuesByPath: <T>(path: string, root: LabelledNode<T>, pathOpts?: Partial<PathOpts$1>) => boolean;
declare const childrenLengthByPath: <T>(path: string, node: LabelledNode<T>, pathOpts?: Partial<PathOpts$1>) => number;
declare const valueByPath: <T>(path: string, node: LabelledNode<T>, pathOpts?: Partial<PathOpts$1>) => T | undefined;
declare const valuesByPath: <T>(path: string, node: LabelledNode<T>, pathOpts?: Partial<PathOpts$1>) => Array<T>;
declare const Pathed_addValueByPath: typeof addValueByPath;
declare const Pathed_childrenLengthByPath: typeof childrenLengthByPath;
declare const Pathed_clearValuesByPath: typeof clearValuesByPath;
declare const Pathed_removeByPath: typeof removeByPath;
declare const Pathed_valueByPath: typeof valueByPath;
declare const Pathed_valuesByPath: typeof valuesByPath;
declare namespace Pathed {
export { type PathOpts$1 as PathOpts, Pathed_addValueByPath as addValueByPath, Pathed_childrenLengthByPath as childrenLengthByPath, Pathed_clearValuesByPath as clearValuesByPath, create$1 as create, Pathed_removeByPath as removeByPath, Pathed_valueByPath as valueByPath, Pathed_valuesByPath as valuesByPath };
}
type Entry = Readonly<{
name: string;
sourceValue: any;
nodeValue: any;
}>;
type EntryWithAncestors = Readonly<{
name: string;
sourceValue: any;
nodeValue: any;
ancestors: Array<string>;
}>;
type EntryStatic = Readonly<{
name: string;
value: any;
ancestors: Array<string>;
}>;
/**
* Options for parsing a path
*/
type PathOpts = {
/**
* Separator for path, eg '.'
*/
readonly separator?: string;
};
/**
* Helper function to get a 'friendly' string representation of an array of {@link Entry}.
* @param entries
* @returns
*/
declare function prettyPrintEntries(entries: ReadonlyArray<Entry>): string;
/**
* Returns a human-friendly debug string for a tree-like structure
* ```js
* console.log(Trees.prettyPrint(obj));
* ```
* @param indent
* @param node
* @param options
* @returns
*/
declare const prettyPrint: (node: object, indent?: number, options?: Partial<ChildrenOptions>) => string;
/**
* Returns a debug string representation of the node (recursive)
* @param node
* @param indent
* @returns
*/
declare const toStringDeep$1: (node: TreeNode<Entry | EntryStatic>, indent?: number) => string;
type ChildrenOptions = Readonly<{
/**
* If set, only uses leaves or branches. 'none' means there is no filter.
*/
filter: `none` | `leaves` | `branches`;
/**
* Default name to use. This is necessary in some cases, eg a root object.
*/
name: string;
}>;
/**
* Returns the direct children of a tree-like object as a pairing
* of node name and value. Supports basic objects, Maps and arrays.
*
* Sub-children are included as an object blob.
*
* @example Simple object
* ```js
* const o = {
* colour: {
* r: 0.5, g: 0.5, b: 0.5
* }
* };
*
* const children = [ ...Trees.children(o) ];
* // Children:
* // [
* // { name: "colour", value: { b: 0.5, g: 0.5, r: 0.5 } }
* // ]
* const subChildren = [ ...Trees.children(o.colour) ];
* // [ { name: "r", value: 0.5 }, { name: "g", value: 0.5 }, { name: "b", value: 0.5 } ]
* ```
*
* Arrays are assigned a name based on index.
* @example Arrays
* ```js
* const colours = [ { r: 1, g: 0, b: 0 }, { r: 0, g: 1, b: 0 }, { r: 0, g: 0, b: 1 } ];
* // Children:
* // [
* // { name: "array[0]", value: {r:1,g:0,b:0} },
* // { name: "array[1]", value: {r:0,g:1,b:0} },
* // { name: "array[2]", value: {r:0,g:0,b:1} },
* // ]
* ```
*
* Pass in `options.name` (eg 'colours') to have names generated as 'colours[0]', etc.
* Options can also be used to filter children. By default all direct children are returned.
* @param node
* @param options
*/
declare function children<T extends object>(node: T, options?: Partial<ChildrenOptions>): IterableIterator<Entry>;
declare function depthFirst$1<T extends object>(node: T, options?: Partial<ChildrenOptions>, ancestors?: Array<string>): IterableIterator<EntryWithAncestors>;
/**
* Returns the closest matching entry, tracing `path` in an array, Map or simple object.
* Returns an entry with _undefined_ value at the point where tracing stopped.
* Use {@link traceByPath} to step through all the segments.
*
* ```js
* const people = {
* jane: {
* address: {
* postcode: 1000,
* street: 'West St',
* city: 'Blahville'
* },
* colour: 'red'
* }
* }
* Trees.getByPath('jane.address.postcode', people); // '.' default separator
* // ['postcode', 1000]
* Trees.getByPath('jane.address.country.state', people);
* // ['country', undefined] - since full path could not be resolved.
* ```
* @param path Path, eg `jane.address.postcode`
* @param node Node to look within
* @param options Options for parsing path. By default '.' is used as a separator
* @returns
*/
declare function getByPath<T extends object>(path: string, node: T, options?: PathOpts): Entry;
/**
* Enumerates over children of `node` towards the node named in `path`.
* This is useful if you want to get the interim steps to the target node.
*
* Use {@link getByPath} if you don't care about interim steps.
*
* ```js
* const people = {
* jane: {
* address: {
* postcode: 1000,
* street: 'West St',
* city: 'Blahville'
* },
* colour: 'red'
* }
* }
* for (const p of Trees.traceByPath('jane.address.street', people)) {
* // { name: "jane", value: { address: { postcode: 1000,street: 'West St', city: 'Blahville' }, colour: 'red'} },
* // { name: "address", value: { postcode: 1000, street: 'West St', city: 'Blahville' } },
* // { name: "street", value: "West St" } }
* }
* ```
*
* Results stop when the path can't be followed any further.
* The last entry will have a name of the last sought path segment, and _undefined_ as its value.
*
* @param path Path to traverse
* @param node Starting node
* @param options Options for path traversal logic
* @returns
*/
declare function traceByPath<T extends object>(path: string, node: T, options?: PathOpts): Iterable<EntryWithAncestors>;
/**
* Returns a projection of `node` as a dynamic traversable.
* This means that the tree structure is dynamically created as last-minute as possible.
*
* Note that the object identity of TraversableTree return results is not stable.
* This is because they are created on-the-fly by reading fields of `node`.
*
* ```js
* const c1 = [ ...asDynamicTraversable(someObject).children() ];
* const c2 = [ ...asDynamicTraversable(someObject).children() ];
*
* // Object identity is not the same
* c1[ 0 ] === c1[ 0 ]; // false
* // ...even though its referring to the same value
* c1[ 0 ].getValue() === c1[ 0 ].getValue(); // true
* ```
*
* Instead .getIdentity() to get a stable identity:
* ```js
* c1[ 0 ].getIdentity() === c2[ 0 ].getIdentity(); // true
* ```
* @param node Object to read
* @param options Options when creating traversable
* @param ancestors Do not use
* @param parent Do not use
* @returns
*/
declare const asDynamicTraversable: <T extends object>(node: T, options?: Partial<ChildrenOptions>, ancestors?: Array<string>, parent?: TraversableTree$1<EntryStatic> | undefined) => TraversableTree$1<EntryStatic>;
/**
* Reads all fields and sub-fields of `node`, returning as a 'wrapped' tree structure.
* @param node
* @param options
* @returns
*/
declare const createWrapped: <T extends object>(node: T, options: Partial<CreateOptions>) => WrappedNode<any>;
type CreateOptions = {
name: string;
/**
* If _true_, only leaf nodes have values. This avoids repetition (important
* when comparing trees), with semantics being in the tree itself.
*
* When _false_ (default) values get decomposed down the tree. This
* makes it easy to get all the data for a branch of the tree.
*
*
* Eg if storing { person: { address { state: `qld` } } }
* When _true_, the tree would be:
* ```
* person, value: undefined
* + address, value: undefined
* + state, value: 'qld'
* ```
* But when _false_, the tree would be:
* ```
* person, value: { address: { state: `qld } }
* + address, value: { state: `qld` }
* + state, value: `qld`
* ```
*/
valuesAtLeaves: boolean;
};
/**
* Reads all fields and sub-fields of `node`, returning as a basic tree structure.
* The structure is a snapshot of the object. If the object changes afterwards, the tree will
* remain the same.
*
* Alternatively, consider {@link asDynamicTraversable} which reads the object dynamically.
* @param node
* @param options
* @returns
*/
declare const create: <T extends object>(node: T, options?: Partial<CreateOptions>) => TreeNode<EntryStatic>;
/**
* Returns a copy of `node` with its (and all its children's) parent information removed.
* @param node
* @param options
* @returns
*/
declare const createSimplified: <T extends object>(node: T, options?: Partial<CreateOptions>) => SimplifiedNode<EntryStatic>;
type TraverseObject_ChildrenOptions = ChildrenOptions;
type TraverseObject_CreateOptions = CreateOptions;
type TraverseObject_Entry = Entry;
type TraverseObject_EntryStatic = EntryStatic;
type TraverseObject_EntryWithAncestors = EntryWithAncestors;
type TraverseObject_PathOpts = PathOpts;
declare const TraverseObject_asDynamicTraversable: typeof asDynamicTraversable;
declare const TraverseObject_children: typeof children;
declare const TraverseObject_create: typeof create;
declare const TraverseObject_createSimplified: typeof createSimplified;
declare const TraverseObject_createWrapped: typeof createWrapped;
declare const TraverseObject_getByPath: typeof getByPath;
declare const TraverseObject_prettyPrint: typeof prettyPrint;
declare const TraverseObject_prettyPrintEntries: typeof prettyPrintEntries;
declare const TraverseObject_traceByPath: typeof traceByPath;
declare namespace TraverseObject {
export { type TraverseObject_ChildrenOptions as ChildrenOptions, type TraverseObject_CreateOptions as CreateOptions, type TraverseObject_Entry as Entry, type TraverseObject_EntryStatic as EntryStatic, type TraverseObject_EntryWithAncestors as EntryWithAncestors, type TraverseObject_PathOpts as PathOpts, TraverseObject_asDynamicTraversable as asDynamicTraversable, TraverseObject_children as children, TraverseObject_create as create, TraverseObject_createSimplified as createSimplified, TraverseObject_createWrapped as createWrapped, depthFirst$1 as depthFirst, TraverseObject_getByPath as getByPath, TraverseObject_prettyPrint as prettyPrint, TraverseObject_prettyPrintEntries as prettyPrintEntries, toStringDeep$1 as toStringDeep, TraverseObject_traceByPath as traceByPath };
}
declare const childrenLength: <T>(tree: TraversableTree$1<T>) => number;
/**
* Returns _true_ if `child` is parented at any level (grand-parented etc) by `possibleParent`
* @param child Child being sought
* @param possibleParent Possible parent of child
* @param eq Equality comparison function {@link isEqualDefault} used by default
* @returns
*/
declare const hasAnyParent: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(child: T, possibleParent: T, eq?: IsEqual<T>) => boolean;
declare const hasAnyParentValue: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(child: T, possibleParentValue: TV, eq?: IsEqual<TV>) => boolean;
declare const findAnyParentByValue: <TValue>(child: TraversableTree$1<TValue>, possibleParentValue: TValue, eq?: IsEqual<TValue>) => TraversableTree$1<TValue> | undefined;
/**
* Returns _true_ if `child` exists within `possibleParent`. By default it only looks at the immediate
* parent (maxDepth: 0). Use Number.MAX_SAFE_INTEGER for searching recursively upwards (or {@link hasAnyParent})
* @param child Child being sought
* @param possibleParent Possible parent of child
* @param maxDepth Max depth of traversal. Default of 0 only looks for immediate parent.
* @param eq Equality comparison function. {@link isEqualDefault} used by default.
* @returns
*/
declare const hasParent: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(child: T, possibleParent: T, eq?: IsEqual<T>, maxDepth?: number) => boolean;
declare const hasParentValue: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(child: T, possibleParentValue: TV, eq?: IsEqual<TV>, maxDepth?: number) => boolean;
declare const findParentByValue: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(child: T, possibleParentValue: TV, eq?: IsEqual<TV>, maxDepth?: number) => T | undefined;
/**
* Returns _true_ if `prospectiveChild` can be legally added to `parent`.
* _False_ is returned if:
* * `parent` and `prospectiveChild` are equal
* * `parent` already contains `prospectiveChild`
* * `prospectiveChild` has `parent` as its own child
*
* Throws an error if `parent` or `prospectiveChild` is null/undefined.
* @param parent Parent to add to
* @param prospectiveChild Prospective child
* @param eq Equality function
*/
declare const couldAddChild: <T>(parent: TraversableTree$1<T>, prospectiveChild: TraversableTree$1<T>, eq?: IsEqual<TraversableTree$1<T>>) => void;
/**
* Returns _true_ if _possibleChild_ is contained within _parent_ tree.
* That is, it is any sub-child.
* @param parent Parent tree
* @param possibleChild Sought child
* @param eq Equality function, or {@link isEqualDefault} if undefined.
* @returns
*/
declare const hasAnyChild: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(parent: T, possibleChild: T, eq?: IsEqual<T>) => boolean;
declare const hasAnyChildValue: <T>(parent: TraversableTree$1<T>, possibleChildValue: T, eq?: IsEqual<T>) => boolean;
/**
* Returns _true_ if _possibleChild_ is contained within _maxDepth_ children
* of _parent_ node. By default only looks at immediate children (maxDepth = 0).
*
* ```js
* // Just check parentNode for childNode
* Trees.hasChild(parentNode, childNode);
* // See if parentNode or parentNode's parents have childNode
* Trees.hasChild(parentNode, childNode, 1);
* // Use custom equality function, in this case comparing on name field
* Trees.hasChild(parentNode, childNode, 0, (a, b) => a.name === b.name);
* ```
* @param parent Parent tree
* @param possibleChild Sought child
* @param maxDepth Maximum depth. 0 for immediate children, Number.MAX_SAFE_INTEGER for boundless
* @param eq Equality function, or {@link isEqualDefault} if undefined.
* @returns
*/
declare const hasChild: <T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(parent: T, possibleChild: T, eq?: IsEqual<T>, maxDepth?: number) => boolean;
declare const hasChildValue: <T>(parent: TraversableTree$1<T>, possibleValue: T, eq?: IsEqual<T>, maxDepth?: number) => boolean;
/**
* Iterates over siblings of `node`.
*
* Other iteration options:
* * {@link breadthFirst}: Children, breadth-first
* * {@link depthFirst}: Children, depth-first
* * {@link parents}: Chain of parents, starting with immediate parent
* * {@link siblings}: Nodes with same parent
* @param node Node to begin from
* @returns
*/
declare function siblings<T>(node: TraversableTree$1<T>): IterableIterator<TraversableTree$1<T>>;
/**
* Iterates over parents of `node`, starting with immediate parent
*
* Other iteration options:
* * {@link breadthFirst}: Children, breadth-first
* * {@link depthFirst}: Children, depth-first
* * {@link parents}: Chain of parents, starting with immediate parent
* * {@link siblings}: Nodes with same parent
* @param node Node to begin from
* @returns
*/
declare function parents<T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(node: T): IterableIterator<T>;
/**
* Descends `parent`, breadth-first, looking for a particular value.
* Returns _undefined_ if not found.
* @param parent
* @param possibleValue
* @param eq
* @returns
*/
declare function findAnyChildByValue<T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(parent: T, possibleValue: TV, eq?: IsEqual<TV>): T | undefined;
/**
* Searches breadth-first for `possibleValue` under and including `parent`.
* `maxDepth` sets he maximum level to which the tree is searched.
* @param parent
* @param possibleValue
* @param eq
* @param maxDepth
* @returns
*/
declare function findChildByValue<T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(parent: T, possibleValue: TV, eq?: IsEqual<TV>, maxDepth?: number): T | undefined;
/**
* Iterates over children of `root`, depth-first.
*
* Other iteration options:
* * {@link breadthFirst}: Children, breadth-first
* * {@link depthFirst}: Children, depth-first
* * {@link parents}: Chain of parents, starting with immediate parent
* * {@link siblings}: Nodes with same parent
* @param root Root node
* @returns
*/
declare function depthFirst<T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(root: T): Generator<T>;
/**
* Iterates over the children of `root`, breadth-first
*
* Other iteration options:
* * {@link breadthFirst}: Children, breadth-first
* * {@link depthFirst}: Children, depth-first
* * {@link parents}: Chain of parents, starting with immediate parent
* * {@link siblings}: Nodes with same parent
* @param root Root node
* @param depth How many levels to traverse
* @returns
*/
declare function breadthFirst<T extends TraversableTree$1<TV> | TreeNode<TV>, TV>(root: T, depth?: number): IterableIterator<T>;
/**
* Applies `predicate` to `root` and all its child nodes, returning the node where
* `predicate` yields _true_.
* Use {@link findByValue} to find a node by its value
* @param root
* @param predicate
* @param order Iterate children by breadth or depth. Default 'breadth'
* @returns
*/
declare function find<T>(root: TraversableTree$1<T>, predicate: (node: TraversableTree$1<T>) => boolean, order?: `breadth` | `depth`): TraversableTree$1<T> | undefined;
/**
* Applies `predicate` to `root` and all its child nodes, returning the node value for
* `predicate` yields _true_.
* Use {@link find} to filter by nodes rather than values
*
* ```js
* const n = findByValue(root, (v) => v.name === 'Bob');
* ```
* @param root
* @param predicate
* @param order Iterate children by breadth or depth. Default 'breadth'
* @returns
*/
declare function findByValue<T>(root: TraversableTree$1<T>, predicate: (nodeValue: T) => boolean, order?: `breadth` | `depth`): TraversableTree$1<T> | undefined;
/**
* Search through children in a path-like manner.
*
* It finds the first child of `root` that matches `continuePredicate`.
* The function gets passed a depth of 1 to begin with. It recurses, looking for the next sub-child, etc.
*
* If it can't find a child, it stops.
*
* This is different to 'find' functions, which exhausively search all possible child nodes, regardless of position in tree.
*
* ```js
* const path = 'a.aa.aaa'.split('.');
* const pred = (nodeValue, depth) => {
* if (nodeValue === path[0]) {
* path.shift(); // Remove first element
* return true;
* }
* return false;
* }
*
* // Assuming we have a tree of string values:
* // a
* // - aa
* // - aaa
* // - ab
* // b
* // - ba
* for (const c of follow(tree, pred)) {
* // Returns nodes: a, aa and then aaa
* }
* ```
* @param root
* @param continuePredicate
* @param depth
*/
declare function followValue<T>(root: TraversableTree$1<T>, continuePredicate: (nodeValue: T, depth: number) => boolean, depth?: number): IterableIterator<T>;
declare function toStringDeep<T>(node: TraversableTree$1<T>, depth?: number): string;
declare function toString(...nodes: Array<TraversableTree$1<any>>): string;
declare const TraversableTree_breadthFirst: typeof breadthFirst;
declare const TraversableTree_childrenLength: typeof childrenLength;
declare const TraversableTree_couldAddChild: typeof couldAddChild;
declare const TraversableTree_depthFirst: typeof depthFirst;
declare const TraversableTree_find: typeof find;
declare const TraversableTree_findAnyChildByValue: typeof findAnyChildByValue;
declare const TraversableTree_findAnyParentByValue: typeof findAnyParentByValue;
declare const TraversableTree_findByValue: typeof findByValue;
declare const TraversableTree_findChildByValue: typeof findChildByValue;
declare const TraversableTree_findParentByValue: typeof findParentByValue;
declare const TraversableTree_followValue: typeof followValue;
declare const TraversableTree_hasAnyChild: typeof hasAnyChild;
declare const TraversableTree_hasAnyChildValue: typeof hasAnyChildValue;
declare const TraversableTree_hasAnyParent: typeof hasAnyParent;
declare const TraversableTree_hasAnyParentValue: typeof hasAnyParentValue;
declare const TraversableTree_hasChild: typeof hasChild;
declare const TraversableTree_hasChildValue: typeof hasChildValue;
declare const TraversableTree_hasParent: typeof hasParent;
declare const TraversableTree_hasParentValue: typeof hasParentValue;
declare const TraversableTree_parents: typeof parents;
declare const TraversableTree_siblings: typeof siblings;
declare const TraversableTree_toString: typeof toString;
declare const TraversableTree_toStringDeep: typeof toStringDeep;
declare namespace TraversableTree {
export { TraversableTree_breadthFirst as breadthFirst, TraversableTree_childrenLength as childrenLength, TraversableTree_couldAddChild as couldAddChild, TraversableTree_depthFirst as depthFirst, TraversableTree_find as find, TraversableTree_findAnyChildByValue as findAnyChildByValue, TraversableTree_findAnyParentByValue as findAnyParentByValue, TraversableTree_findByValue as findByValue, TraversableTree_findChildByValue as findChildByValue, TraversableTree_findParentByValue as findParentByValue, TraversableTree_followValue as followValue, TraversableTree_hasAnyChild as hasAnyChild, TraversableTree_hasAnyChildValue as hasAnyChildValue, TraversableTree_hasAnyParent as hasAnyParent, TraversableTree_hasAnyParentValue as hasAnyParentValue, TraversableTree_hasChild as hasChild, TraversableTree_hasChildValue as hasChildValue, TraversableTree_hasParent as hasParent, TraversableTree_hasParentValue as hasParentValue, TraversableTree_parents as parents, TraversableTree_siblings as siblings, TraversableTree_toString as toString, TraversableTree_toStringDeep as toStringDeep };
}
declare const toTraversable: <T>(node: TreeNode<T> | TraversableTree$1<T> | object) => TraversableTree$1<any>;
declare const isTreeNode: (node: any) => node is TreeNode<any>;
declare const isTraversable: (node: any) => node is TraversableTree$1<any>;
type index_DiffAnnotation<T> = DiffAnnotation<T>;
type index_DiffNode<T> = DiffNode<T>;
declare const index_LabelledNode: typeof LabelledNode;
declare const index_LabelledSingleValue: typeof LabelledSingleValue;
declare const index_LabelledValue: typeof LabelledValue;
declare const index_LabelledValues: typeof LabelledValues;
declare const index_Pathed: typeof Pathed;
declare const index_SimplifiedNode: typeof SimplifiedNode;
declare const index_TreeNode: typeof TreeNode;
declare const index_isTraversable: typeof isTraversable;
declare const index_isTreeNode: typeof isTreeNode;
declare const index_toTraversable: typeof toTraversable;
declare namespace index {
export { type index_DiffAnnotation as DiffAnnotation, type index_DiffNode as DiffNode, TraverseObject as FromObject, index_LabelledNode as LabelledNode, index_LabelledSingleValue as LabelledSingleValue, index_LabelledValue as LabelledValue, index_LabelledValues as LabelledValues, TreeMutable as Mutable, index_Pathed as Pathed, index_SimplifiedNode as SimplifiedNode, TraversableTree$1 as TraversableTree, TraversableTree as Traverse, index_TreeNode as TreeNode, compare$1 as compare, index_isTraversable as isTraversable, index_isTreeNode as isTreeNode, index_toTraversable as toTraversable };
}
export { type DiffAnnotation as D, Pathed as P, TreeMutable as T, isTreeNode as a, isTraversable as b, TraverseObject as c, TraversableTree as d, type DiffNode as e, compare$1 as f, index as i, toTraversable as t };