playground

This commit is contained in:
Jonatan Nilsson 2024-10-22 10:44:53 +00:00
parent a906d51228
commit 474e6ae7ca
3 changed files with 109 additions and 0 deletions

View file

@ -0,0 +1,82 @@
import { printTree } from "./utils.mjs"
/**
* Child {
* char: 'a',
* children: [Child, Child],
* path: null / 'full/path',
* count: 0
* }
*/
function Child(char) {
this.char = char
this.children = []
this.path = null
this.count = 0
}
function buildChild(i, arr) {
let letter = new Child(arr[0][i])
let consume = []
if (arr[0].length === i + 1) {
letter.path = arr[0]
letter.count += 1
} else {
consume = [arr[0]]
}
for (let y = 1; y < arr.length; y++) {
if (arr[y][i] !== letter.char) break
consume.push(arr[y])
}
letter.count += consume.length
while (consume.length) {
letter.children.push(buildChild(i + 1, consume))
consume.splice(0, letter.children[letter.children.length - 1].count)
}
return letter
}
export function buildTree(all) {
let paths = Array.from(new Set(all)).sort()
let builder = []
while (paths.length) {
builder.push(buildChild(0, paths))
paths.splice(0, builder[builder.length - 1].count)
}
printTree(builder)
return builder
}
function IfTreeBranch(branches, indent = 0) {
let output = ''
let indentation = ''.padStart(indent * 2)
for (let i = 0; i < branches.length; i++) {
let branch = branches[i]
output += `${i > 0 ? 'else ': ''}if (str.charCodeAt(${indent}) === ${branch.char.charCodeAt(0)}) {`
if (branch.path) {
output += '\n' + indentation + ` if (str.length === ${branch.path.length}) {`
output += '\n' + indentation + ` return "${branch.path}"`
output += '\n' + indentation + ` }`
}
if (branch.children.length) {
if (branch.path) {
output += ' else '
} else {
output += '\n' + indentation + ' '
}
output += IfTreeBranch(branch.children, indent + 1)
}
output += '\n' + indentation + '} '
}
return output
}
export function compileTreeIntoIfs(tree) {
let output = IfTreeBranch(tree)
output += '\nreturn null'
return new Function(output)
}

View file

@ -0,0 +1,8 @@
export function printTree(children, indent = 0) {
if (!children.length) return
for (let child of children) {
console.log(child.char.padStart(1 + indent * 2))
printTree(child.children, indent + 1)
}
}

19
benchmark/strings.mjs Normal file
View file

@ -0,0 +1,19 @@
import { buildTree, compileTreeIntoIfs } from "./compiler/compiler.mjs"
let paths = [
'test1',
'test',
'test3',
'test5',
'something',
'sometimes',
'else',
'goes',
'here',
'too',
]
let tree = buildTree(paths)
const ifTree = compileTreeIntoIfs(tree)
console.log(ifTree.toString())