6
6
def _rangeImpl (start ):
7
7
def ap (end ):
8
8
step = 1 if start <= end else - 1
9
- return list (_buitins ["range" ](start , end + step , step ))
9
+ return tuple (_buitins ["range" ](start , end + step , step ))
10
10
11
11
return ap
12
12
13
13
14
14
globals ()["range" ] = _rangeImpl
15
15
16
16
17
- replicate = lambda count : lambda value : [value for _ in _buitins ["range" ](count )]
17
+ replicate = lambda count : lambda value : tuple ( [value for _ in _buitins ["range" ](count )])
18
18
19
19
20
20
def _mkFromFoldableImpl ():
@@ -37,7 +37,7 @@ def listToArray(lst):
37
37
while xs is not None :
38
38
result .append (xs .head )
39
39
xs = xs .tail
40
- return result
40
+ return tuple ( result )
41
41
42
42
def result (foldr ):
43
43
def ap (xs ):
@@ -47,14 +47,17 @@ def ap(xs):
47
47
48
48
return result
49
49
50
-
50
+ # TODO: discuss performance consideration with alternative implementation
51
+ # at least should we use 2-tuple instead of class?
52
+ # current implementation is aiming to mimic JS implementation as much as possible
53
+ # same problem in NonEmpty.Internal.py
51
54
fromFoldableImpl = _mkFromFoldableImpl ()
52
55
53
56
length = lambda xs : len (xs )
54
57
55
- cons = lambda e : lambda l : [ e , * l ]
58
+ cons = lambda e : lambda l : ( e , * l )
56
59
57
- snoc = lambda xs : lambda x : [ * xs , x ]
60
+ snoc = lambda xs : lambda x : ( * xs , x )
58
61
59
62
60
63
def unconsImpl (empty ):
@@ -111,9 +114,11 @@ def findLastIndexImpl(just):
111
114
def _insertAtImpl (just , nothing , i , a , l ):
112
115
if i < 0 or i > len (l ):
113
116
return nothing
117
+ # TODO: discuss performance consideration with alternative implementation
118
+ # (*l[i-1], a, *l[i:])
114
119
ll = list (l )
115
120
ll .insert (i , a )
116
- return just (ll )
121
+ return just (tuple ( ll ) )
117
122
118
123
119
124
_insertAt = lambda just : lambda nothing : lambda i : lambda a : lambda l : _insertAtImpl (
@@ -137,24 +142,24 @@ def _updateAtImpl(just, nothing, i, a, l):
137
142
return nothing
138
143
ll = list (l )
139
144
ll [i ] = a
140
- return just (ll )
145
+ return just (tuple ( ll ) )
141
146
142
147
143
148
_updateAt = lambda just : lambda nothing : lambda i : lambda a : lambda l : _updateAtImpl (
144
149
just , nothing , i , a , l
145
150
)
146
151
147
- reverse = lambda xs : list (reversed (xs ))
152
+ reverse = lambda xs : tuple (reversed (xs ))
148
153
149
154
150
155
def concat (xss ):
151
156
result = []
152
157
for x in xss :
153
158
result .extend (x )
154
- return result
159
+ return tuple ( result )
155
160
156
161
157
- filter = lambda f : lambda xs : list (_buitins ["filter" ](f , xs ))
162
+ filter = lambda f : lambda xs : tuple (_buitins ["filter" ](f , xs ))
158
163
159
164
160
165
def partition (f ):
@@ -166,20 +171,22 @@ def result(xs):
166
171
yes .append (x )
167
172
else :
168
173
no .append (x )
169
- return {"yes" : yes , "no" : no }
174
+ return {"yes" : tuple ( yes ) , "no" : tuple ( no ) }
170
175
171
176
return result
172
177
173
178
174
- sortImpl = lambda f : lambda xs : sorted (
175
- xs , key = functools .cmp_to_key (lambda a , b : f (a )(b ))
179
+ sortImpl = lambda f : lambda xs : tuple (
180
+ sorted ( xs , key = functools .cmp_to_key (lambda a , b : f (a )(b ) ))
176
181
)
177
182
178
183
slice = lambda s : lambda e : lambda xs : xs [s :e ]
179
184
180
- take = lambda n : lambda xs : xs [:max (n , 0 )]
181
- drop = lambda n : lambda xs : xs [max (n , 0 ):]
185
+ take = lambda n : lambda xs : xs [: max (n , 0 )]
186
+ drop = lambda n : lambda xs : xs [max (n , 0 ) :]
182
187
183
- zipWith = lambda f : lambda xs : lambda ys : list (map (lambda t : f (t [0 ])(t [1 ]), zip (xs , ys )))
188
+ zipWith = lambda f : lambda xs : lambda ys : tuple (
189
+ map (lambda t : f (t [0 ])(t [1 ]), zip (xs , ys ))
190
+ )
184
191
185
192
unsafeIndexImpl = lambda xs : lambda n : xs [n ]
0 commit comments