diff --git a/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts new file mode 100644 index 00000000..994fff9f --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts @@ -0,0 +1,15 @@ +export function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseLeftChild] = stack.pop()!; + if (node) { + if (didTraverseLeftChild) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} diff --git a/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts b/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts new file mode 100644 index 00000000..d00dfcb8 --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts @@ -0,0 +1,15 @@ +export function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} diff --git a/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts b/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts new file mode 100644 index 00000000..de92dc7b --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts @@ -0,0 +1,12 @@ +export function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap index 02abc76f..139e4f7c 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap @@ -827,6 +827,69 @@ function compareNatural(a, b) { /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; +exports[`App can equip single goody: JavaScript traverseInorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traverseInorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseLeftChild] = stack.pop(); + if (node) { + if (didTraverseLeftChild) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: JavaScript traversePostorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePostorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: JavaScript traversePreorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePreorder(root) { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + exports[`App can equip single goody: Kotlin gcd(Int,Int) 1`] = ` "////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// // Adventure Pack commit fake-commit-hash @@ -1956,3 +2019,72 @@ function compareNatural(a: T, b: T): number { /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; + +exports[`App can equip single goody: TypeScript traverseInorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseLeftChild] = stack.pop()!; + if (node) { + if (didTraverseLeftChild) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: TypeScript traversePostorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: TypeScript traversePreorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap index dca3b7ef..3e36e7a9 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap @@ -507,6 +507,51 @@ exports[`App can render goody: JavaScript compareNatural 1`] = ` }" `; +exports[`App can render goody: JavaScript traverseInorder 1`] = ` +"export function* traverseInorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseLeftChild] = stack.pop(); + if (node) { + if (didTraverseLeftChild) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: JavaScript traversePostorder 1`] = ` +"export function* traversePostorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: JavaScript traversePreorder 1`] = ` +"export function* traversePreorder(root) { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +}" +`; + exports[`App can render goody: Kotlin gcd(Int,Int) 1`] = ` "package gcd_int_int @@ -1226,3 +1271,54 @@ exports[`App can render goody: TypeScript compareNatural 1`] = ` throw new Error("Comparing mismatched types!"); }" `; + +exports[`App can render goody: TypeScript traverseInorder 1`] = ` +"export function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseLeftChild] = stack.pop()!; + if (node) { + if (didTraverseLeftChild) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: TypeScript traversePostorder 1`] = ` +"export function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: TypeScript traversePreorder 1`] = ` +"export function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +}" +`;