Mercurial > repos > tabletprog
comparison modules/array.tp @ 144:547153211389
Fix fold:with foldr:with and map in the array module
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 09 Aug 2013 03:58:42 -0700 |
parents | 9811040704ac |
children | ca249978ae96 |
comparison
equal
deleted
inserted
replaced
143:282b8056b702 | 144:547153211389 |
---|---|
9 (self data) get: (index num) | 9 (self data) get: (index num) |
10 } else: { | 10 } else: { |
11 false | 11 false |
12 } | 12 } |
13 } | 13 } |
14 | 14 |
15 llMessage: set withVars: { | 15 llMessage: set withVars: { |
16 index <- obj_int32 ptr | 16 index <- obj_int32 ptr |
17 value <- object ptr | 17 value <- object ptr |
18 } andCode: :index value { | 18 } andCode: :index value { |
19 if: (index num) >= 0 && (index num) < size { | 19 if: (index num) >= 0 && (index num) < size { |
20 data set: (index num) value | 20 data set: (index num) value |
21 } | 21 } |
22 self | 22 self |
23 } | 23 } |
24 | 24 |
25 llMessage: foreach withVars: { | 25 llMessage: foreach withVars: { |
26 clos <- lambda ptr | 26 clos <- lambda ptr |
27 i <- uint32_t | 27 i <- uint32_t |
28 index <- obj_int32 ptr | 28 index <- obj_int32 ptr |
29 } andCode: :clos { | 29 } andCode: :clos { |
34 ccall: clos 2 index (data get: i) | 34 ccall: clos 2 index (data get: i) |
35 i <- i + 1 | 35 i <- i + 1 |
36 } | 36 } |
37 self | 37 self |
38 } | 38 } |
39 | 39 |
40 llMessage: append withVars: { | 40 llMessage: append withVars: { |
41 value <- object ptr | 41 value <- object ptr |
42 tmp <- (object ptr) ptr | 42 tmp <- (object ptr) ptr |
43 } andCode: :value { | 43 } andCode: :value { |
44 if: storage = size { | 44 if: storage = size { |
52 } | 52 } |
53 data set: size value | 53 data set: size value |
54 size <- size + 1 | 54 size <- size + 1 |
55 self | 55 self |
56 } | 56 } |
57 | 57 |
58 llMessage: length withVars: { | 58 llMessage: length withVars: { |
59 intret <- obj_int32 ptr | 59 intret <- obj_int32 ptr |
60 } andCode: { | 60 } andCode: { |
61 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 | 61 intret <- make_object: (addr_of: obj_int32_meta) NULL 0 |
62 intret num!: size | 62 intret num!: size |
63 intret | 63 intret |
64 } | 64 } |
65 | 65 |
66 fold:with <- :acc :fun { | 66 fold:with <- :acc :fun { |
67 foreach: self :idx el { | 67 foreach: self :idx el { |
68 fun: acc el | 68 acc <- fun: acc el |
69 } | 69 } |
70 acc | |
70 } | 71 } |
71 | 72 |
72 foldr:with <- :acc :fun { | 73 foldr:with <- :acc :fun { |
73 idx <- length - 1 | 74 idx <- length - 1 |
74 while: {idx >= 0} do: { | 75 while: {idx >= 0} do: { |
75 fun: acc (get: idx) | 76 acc <- fun: acc (get: idx) |
76 } | 77 } |
78 acc | |
77 } | 79 } |
78 | 80 |
79 map <- :fun { | 81 map <- :fun { |
80 new <- #[] | 82 new <- #[] |
81 foreach: self :idx el { | 83 foreach: self :idx el { |
82 new append: (fun: el) | 84 new append: (fun: el) |
83 } | 85 } |
86 new | |
84 } | 87 } |
85 | 88 |
86 find:withDefault <- :pred :default{ | 89 find:withDefault <- :pred :default{ |
87 idx <- 0 | 90 idx <- 0 |
88 l <- length | 91 l <- length |
89 ret <- default | 92 ret <- default |
90 while: {idx < l} do: { | 93 while: {idx < l} do: { |