Mercurial > repos > icfp2014
view code/tree.lm @ 79:dcfa97976071
Better handling of target selection
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Jul 2014 03:24:21 -0700 |
parents | e1047192610c |
children |
line wrap: on
line source
#{ 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)] } _filledTree <- :val size { ret <- 0 half <- size / 2 if: size > 2 { ret <- #[ (_filledTree: val half) (_filledTree: val size-half) ] } else: { ret <- #[val val] } ret } filledTree <- :val size { #[size (_filledTree: val 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 } } }