Mercurial > repos > icfp2014
diff code/tree.lm @ 40:d5ccb66ae98b
Move some basic library code out of dotScanner.lm into separate files now that import:from works
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 26 Jul 2014 15:29:01 -0700 |
parents | |
children | e1047192610c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code/tree.lm Sat Jul 26 15:29:01 2014 -0700 @@ -0,0 +1,109 @@ +#{ + makeTree:size <- :lst :size { + ret <- 0 + sub <- 0 + half <- size / 2 + if: size = 2 { + ret <- #[(lst value) ((lst tail) value)] + } else: { + if: size = 1 { + ret <- lst + } else: { + sub <- split: lst at: half + ret <- #[ + (makeTree: (sub value) size: half) + (makeTree: (sub tail) size: size-half) + ] + } + } + ret + } + + makeTree <- :lst { + size <- lst length + #[size (makeTree: lst size: size)] + } + + get:fromTree:size <- :idx :tree :size { + ret <- 0 + half <- size / 2 + if: size <= 2 { + if: idx = 0 { + ret <- tree value + } else: { + ret <- tree tail + } + } else: { + if: idx < half { + ret <- get: idx fromTree: (tree value) size: half + } else: { + ret <- get: idx-half fromTree: (tree tail) size: size-half + } + } + ret + } + + get:fromTree <- :idx :tree { + size <- tree value + get: idx fromTree: (tree tail) size: size + } + + treeMap:size <- :tree fun :size { + ret <- 0 + half <- size / 2 + if: size = 2 { + ret <- #[(fun: (tree value)) (fun: (tree tail))] + } else: { + if: size = 1 { + ret <- #[(fun: (tree value)) 0] + } else: { + ret <- #[ + (treeMap: (tree value) fun size: half) + (treeMap: (tree tail) fun size: size-half) + ] + } + } + ret + } + + treeMap <- :tree fun { + #[(tree value) (treeMap: (tree tail) fun size: (tree value))] + } + + tree:size:update:with <- :tree :size :idx :fun { + ret <- 0 + half <- size / 2 + if: size = 2 { + if: idx = 0 { + ret <- #[(fun: (tree value)) (tree tail)] + } else: { + ret <- #[(tree value) (fun: (tree tail))] + } + } else: { + if: size = 1 { + ret <- #[(fun: (tree value)) 0] + } else: { + if: (idx < half) { + ret <- #[ + (tree: (tree value) size: half update: idx with: fun) + (tree tail) + ] + } else: { + ret <- #[ + (tree value) + (tree: (tree tail) size: size-half update: idx-half with: fun) + ] + } + } + } + ret + } + + tree:update:with <- :tree :idx :fun { + #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)] + } + + tree:set:to <- :tree :idx :val { + tree: tree update: idx with: :el { val } + } +} \ No newline at end of file