# HG changeset patch # User Michael Pavone # Date 1406413741 25200 # Node ID d5ccb66ae98bd504f65496b709223559f480bdac # Parent 0e1fc2b2832f153e36b56414fcc8ee8a24139459 Move some basic library code out of dotScanner.lm into separate files now that import:from works diff -r 0e1fc2b2832f -r d5ccb66ae98b code/dotScanner.lm --- 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 diff -r 0e1fc2b2832f -r d5ccb66ae98b code/ll.lm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code/ll.lm Sat Jul 26 15:29:01 2014 -0700 @@ -0,0 +1,66 @@ +#{ + 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 + } + } + } +} \ No newline at end of file diff -r 0e1fc2b2832f -r d5ccb66ae98b code/tree.lm --- /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