Mercurial > repos > icfp2014
diff code/dotScanner.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 | 8c26981aae8c |
children | d631e68a45d5 |
line wrap: on
line diff
--- a/code/dotScanner.lm Sat Jul 26 15:25:41 2014 -0700 +++ b/code/dotScanner.lm Sat Jul 26 15:29:01 2014 -0700 @@ -1,176 +1,25 @@ #{ - length <- :lst { - len <- [] - while: { not: (lst isInteger?)} do: { - lst <- lst tail - len <- len + 1 - } - len - } - - reverse <- :lst { - new <- [] - while: { not: (lst isInteger?)} do: { - new <- (lst value) | new - lst <- lst tail - } - new - } - - split:at <- :lst :pos { - first <- [] - i <- 0 - while: { i < pos } do: { - first <- (lst value) | first - lst <- lst tail - i <- i + 1 - } - #[(reverse: first) lst] - } - - map <- :lst fun { - new <- [] - while: { not: (lst isInteger?) } do: { - new <- (fun: (lst value)) | new - lst <- lst tail - } - reverse: new - } - - fold:with <- :lst acc :fun { - while: { not: (lst isInteger?) } do: { - acc <- fun: acc (lst value) - lst <- lst tail - } - acc - } - - filter <- :lst pred { - new <- [] - while: { not: (lst isInteger?) } do: { - if: (pred: (lst value)) { - new <- (lst value) | new - } else: {} - lst <- lst tail - } - reverse: new - } - - flatten <- :lst { - fold: lst [] with: :acc el { - fold: el acc with: :iacc iel { - iel | iacc - } - } - } - - 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 } - } + import: [ + length + reverse + split:at + map + fold:with + filter + flatten + ] from: (module: "ll.lm") + + import: [ + makeTree:size + makeTree + get:fromTree:size + get:fromTree + treeMap:size + treeMap + tree:size:update:with + tree:update:with + tree:set:to + ] from: (module: "tree.lm") grid:get <- :grid :pos { x <- pos value