|
5 | 5 | from abc import ABCMeta, abstractmethod |
6 | 6 | from itertools import zip_longest |
7 | 7 |
|
8 | | -from unpythonic.fun import composer1 |
| 8 | +from unpythonic.fun import composeri1 |
9 | 9 | from unpythonic.it import foldr, foldl |
10 | 10 |
|
11 | 11 | # explicit list better for tooling support |
@@ -182,47 +182,56 @@ def __eq__(self, other): |
182 | 182 | def __hash__(self): |
183 | 183 | return hash((hash(self.car), hash(self.cdr))) |
184 | 184 |
|
185 | | -def car(x): |
186 | | - """Return the first half of a cons cell.""" |
| 185 | +def _car(x): |
| 186 | + return _typecheck(x).car |
| 187 | +def _cdr(x): |
| 188 | + return _typecheck(x).cdr |
| 189 | +def _typecheck(x): |
187 | 190 | if not isinstance(x, cons): |
188 | 191 | raise TypeError("Expected a cons, got {} with value {}".format(type(x), x)) |
189 | | - return x.car |
| 192 | + return x |
| 193 | +def _build_accessor(name): |
| 194 | + spec = name[1:-1] |
| 195 | + f = {'a': _car, 'd': _cdr} |
| 196 | + return composeri1(f[char] for char in spec) |
| 197 | + |
| 198 | +def car(x): |
| 199 | + """Return the first half of a cons cell.""" # no autobuild, we want a docstring. |
| 200 | + return _car(x) |
190 | 201 | def cdr(x): |
191 | 202 | """Return the second half of a cons cell.""" |
192 | | - if not isinstance(x, cons): |
193 | | - raise TypeError("Expected a cons, got {} with value {}".format(type(x), x)) |
194 | | - return x.cdr |
195 | | - |
196 | | -caar = composer1(car, car) |
197 | | -cadr = composer1(car, cdr) |
198 | | -cdar = composer1(cdr, car) |
199 | | -cddr = composer1(cdr, cdr) |
200 | | - |
201 | | -caaar = composer1(car, car, car) |
202 | | -caadr = composer1(car, car, cdr) |
203 | | -cadar = composer1(car, cdr, car) |
204 | | -caddr = composer1(car, cdr, cdr) |
205 | | -cdaar = composer1(cdr, car, car) |
206 | | -cdadr = composer1(cdr, car, cdr) |
207 | | -cddar = composer1(cdr, cdr, car) |
208 | | -cdddr = composer1(cdr, cdr, cdr) |
209 | | - |
210 | | -caaaar = composer1(car, car, car, car) |
211 | | -caaadr = composer1(car, car, car, cdr) |
212 | | -caadar = composer1(car, car, cdr, car) |
213 | | -caaddr = composer1(car, car, cdr, cdr) |
214 | | -cadaar = composer1(car, cdr, car, car) |
215 | | -cadadr = composer1(car, cdr, car, cdr) |
216 | | -caddar = composer1(car, cdr, cdr, car) |
217 | | -cadddr = composer1(car, cdr, cdr, cdr) |
218 | | -cdaaar = composer1(cdr, car, car, car) |
219 | | -cdaadr = composer1(cdr, car, car, cdr) |
220 | | -cdadar = composer1(cdr, car, cdr, car) |
221 | | -cdaddr = composer1(cdr, car, cdr, cdr) |
222 | | -cddaar = composer1(cdr, cdr, car, car) |
223 | | -cddadr = composer1(cdr, cdr, car, cdr) |
224 | | -cdddar = composer1(cdr, cdr, cdr, car) |
225 | | -cddddr = composer1(cdr, cdr, cdr, cdr) |
| 203 | + return _cdr(x) |
| 204 | + |
| 205 | +caar = _build_accessor("caar") |
| 206 | +cadr = _build_accessor("cadr") |
| 207 | +cdar = _build_accessor("cdar") |
| 208 | +cddr = _build_accessor("cddr") |
| 209 | + |
| 210 | +caaar = _build_accessor("caaar") |
| 211 | +caadr = _build_accessor("caadr") |
| 212 | +cadar = _build_accessor("cadar") # look, it's Darth Cadar! |
| 213 | +caddr = _build_accessor("caddr") |
| 214 | +cdaar = _build_accessor("cdaar") |
| 215 | +cdadr = _build_accessor("cdadr") |
| 216 | +cddar = _build_accessor("cddar") |
| 217 | +cdddr = _build_accessor("cdddr") |
| 218 | + |
| 219 | +caaaar = _build_accessor("caaaar") |
| 220 | +caaadr = _build_accessor("caaadr") |
| 221 | +caadar = _build_accessor("caadar") |
| 222 | +caaddr = _build_accessor("caaddr") |
| 223 | +cadaar = _build_accessor("cadaar") |
| 224 | +cadadr = _build_accessor("cadadr") |
| 225 | +caddar = _build_accessor("caddar") |
| 226 | +cadddr = _build_accessor("cadddr") |
| 227 | +cdaaar = _build_accessor("cdaaar") |
| 228 | +cdaadr = _build_accessor("cdaadr") |
| 229 | +cdadar = _build_accessor("cdadar") |
| 230 | +cdaddr = _build_accessor("cdaddr") |
| 231 | +cddaar = _build_accessor("cddaar") |
| 232 | +cddadr = _build_accessor("cddadr") |
| 233 | +cdddar = _build_accessor("cdddar") |
| 234 | +cddddr = _build_accessor("cddddr") |
226 | 235 |
|
227 | 236 | def ll(*elts): |
228 | 237 | """Pack elts to a linked list.""" |
|
0 commit comments