summaryrefslogtreecommitdiff
path: root/src/prelude
diff options
context:
space:
mode:
authorAya Morisawa <AyaMorisawa4869@gmail.com>2018-12-20 19:41:04 +0900
committerAya Morisawa <AyaMorisawa4869@gmail.com>2018-12-20 19:42:10 +0900
commite9f8897fe28249642d47dd1ecf3e6a76b552ddf5 (patch)
treec64445f671f782ae2a08e149400b1297f99e5eae /src/prelude
parentFix overlap of birthday label on datepicker (#3697) (diff)
downloadmisskey-e9f8897fe28249642d47dd1ecf3e6a76b552ddf5.tar.gz
misskey-e9f8897fe28249642d47dd1ecf3e6a76b552ddf5.tar.bz2
misskey-e9f8897fe28249642d47dd1ecf3e6a76b552ddf5.zip
Refactor MFM
Co-authored-by: syuilo syuilotan@yahoo.co.jp
Diffstat (limited to 'src/prelude')
-rw-r--r--src/prelude/tree.ts36
1 files changed, 36 insertions, 0 deletions
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<T> = {
+ node: T,
+ children: Forest<T>;
+};
+
+export type Forest<T> = Tree<T>[];
+
+export function createLeaf<T>(node: T): Tree<T> {
+ return { node, children: [] };
+}
+
+export function createTree<T>(node: T, children: Forest<T>): Tree<T> {
+ return { node, children };
+}
+
+export function hasChildren<T>(t: Tree<T>): boolean {
+ return t.children.length !== 0;
+}
+
+export function preorder<T>(t: Tree<T>): T[] {
+ return [t.node, ...preorderF(t.children)];
+}
+
+export function preorderF<T>(ts: Forest<T>): T[] {
+ return concat(ts.map(preorder));
+}
+
+export function countNodes<T>(t: Tree<T>): number {
+ return preorder(t).length;
+}
+
+export function countNodesF<T>(ts: Forest<T>): number {
+ return sum(ts.map(countNodes));
+}