comparison 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
comparison
equal deleted inserted replaced
39:0e1fc2b2832f 40:d5ccb66ae98b
1 #{ 1 #{
2 length <- :lst { 2 import: [
3 len <- [] 3 length
4 while: { not: (lst isInteger?)} do: { 4 reverse
5 lst <- lst tail 5 split:at
6 len <- len + 1 6 map
7 } 7 fold:with
8 len 8 filter
9 } 9 flatten
10 10 ] from: (module: "ll.lm")
11 reverse <- :lst { 11
12 new <- [] 12 import: [
13 while: { not: (lst isInteger?)} do: { 13 makeTree:size
14 new <- (lst value) | new 14 makeTree
15 lst <- lst tail 15 get:fromTree:size
16 } 16 get:fromTree
17 new 17 treeMap:size
18 } 18 treeMap
19 19 tree:size:update:with
20 split:at <- :lst :pos { 20 tree:update:with
21 first <- [] 21 tree:set:to
22 i <- 0 22 ] from: (module: "tree.lm")
23 while: { i < pos } do: {
24 first <- (lst value) | first
25 lst <- lst tail
26 i <- i + 1
27 }
28 #[(reverse: first) lst]
29 }
30
31 map <- :lst fun {
32 new <- []
33 while: { not: (lst isInteger?) } do: {
34 new <- (fun: (lst value)) | new
35 lst <- lst tail
36 }
37 reverse: new
38 }
39
40 fold:with <- :lst acc :fun {
41 while: { not: (lst isInteger?) } do: {
42 acc <- fun: acc (lst value)
43 lst <- lst tail
44 }
45 acc
46 }
47
48 filter <- :lst pred {
49 new <- []
50 while: { not: (lst isInteger?) } do: {
51 if: (pred: (lst value)) {
52 new <- (lst value) | new
53 } else: {}
54 lst <- lst tail
55 }
56 reverse: new
57 }
58
59 flatten <- :lst {
60 fold: lst [] with: :acc el {
61 fold: el acc with: :iacc iel {
62 iel | iacc
63 }
64 }
65 }
66
67 makeTree:size <- :lst :size {
68 ret <- 0
69 sub <- 0
70 half <- size / 2
71 if: size = 2 {
72 ret <- #[(lst value) ((lst tail) value)]
73 } else: {
74 if: size = 1 {
75 ret <- lst
76 } else: {
77 sub <- split: lst at: half
78 ret <- #[
79 (makeTree: (sub value) size: half)
80 (makeTree: (sub tail) size: size-half)
81 ]
82 }
83 }
84 ret
85 }
86
87 makeTree <- :lst {
88 size <- lst length
89 #[size (makeTree: lst size: size)]
90 }
91
92 get:fromTree:size <- :idx :tree :size {
93 ret <- 0
94 half <- size / 2
95 if: size <= 2 {
96 if: idx = 0 {
97 ret <- tree value
98 } else: {
99 ret <- tree tail
100 }
101 } else: {
102 if: idx < half {
103 ret <- get: idx fromTree: (tree value) size: half
104 } else: {
105 ret <- get: idx-half fromTree: (tree tail) size: size-half
106 }
107 }
108 ret
109 }
110
111 get:fromTree <- :idx :tree {
112 size <- tree value
113 get: idx fromTree: (tree tail) size: size
114 }
115
116 treeMap:size <- :tree fun :size {
117 ret <- 0
118 half <- size / 2
119 if: size = 2 {
120 ret <- #[(fun: (tree value)) (fun: (tree tail))]
121 } else: {
122 if: size = 1 {
123 ret <- #[(fun: (tree value)) 0]
124 } else: {
125 ret <- #[
126 (treeMap: (tree value) fun size: half)
127 (treeMap: (tree tail) fun size: size-half)
128 ]
129 }
130 }
131 ret
132 }
133
134 treeMap <- :tree fun {
135 #[(tree value) (treeMap: (tree tail) fun size: (tree value))]
136 }
137
138 tree:size:update:with <- :tree :size :idx :fun {
139 ret <- 0
140 half <- size / 2
141 if: size = 2 {
142 if: idx = 0 {
143 ret <- #[(fun: (tree value)) (tree tail)]
144 } else: {
145 ret <- #[(tree value) (fun: (tree tail))]
146 }
147 } else: {
148 if: size = 1 {
149 ret <- #[(fun: (tree value)) 0]
150 } else: {
151 if: (idx < half) {
152 ret <- #[
153 (tree: (tree value) size: half update: idx with: fun)
154 (tree tail)
155 ]
156 } else: {
157 ret <- #[
158 (tree value)
159 (tree: (tree tail) size: size-half update: idx-half with: fun)
160 ]
161 }
162 }
163 }
164 ret
165 }
166
167 tree:update:with <- :tree :idx :fun {
168 #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)]
169 }
170
171 tree:set:to <- :tree :idx :val {
172 tree: tree update: idx with: :el { val }
173 }
174 23
175 grid:get <- :grid :pos { 24 grid:get <- :grid :pos {
176 x <- pos value 25 x <- pos value
177 y <- pos tail 26 y <- pos tail
178 get: x fromTree: (get: y fromTree: grid) 27 get: x fromTree: (get: y fromTree: grid)