From e9f8897fe28249642d47dd1ecf3e6a76b552ddf5 Mon Sep 17 00:00:00 2001 From: Aya Morisawa Date: Thu, 20 Dec 2018 19:41:04 +0900 Subject: Refactor MFM Co-authored-by: syuilo syuilotan@yahoo.co.jp --- src/prelude/tree.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/prelude/tree.ts (limited to 'src/prelude') diff --git a/src/prelude/tree.ts b/src/prelude/tree.ts new file mode 100644 index 0000000000..519234a0b0 --- /dev/null +++ b/src/prelude/tree.ts @@ -0,0 +1,36 @@ +import { concat, sum } from './array'; + +export type Tree = { + node: T, + children: Forest; +}; + +export type Forest = Tree[]; + +export function createLeaf(node: T): Tree { + return { node, children: [] }; +} + +export function createTree(node: T, children: Forest): Tree { + return { node, children }; +} + +export function hasChildren(t: Tree): boolean { + return t.children.length !== 0; +} + +export function preorder(t: Tree): T[] { + return [t.node, ...preorderF(t.children)]; +} + +export function preorderF(ts: Forest): T[] { + return concat(ts.map(preorder)); +} + +export function countNodes(t: Tree): number { + return preorder(t).length; +} + +export function countNodesF(ts: Forest): number { + return sum(ts.map(countNodes)); +} -- cgit v1.2.3-freya