Skip to content

Commit c1214f0

Browse files
committed
refactor accessor generation
1 parent b74e02e commit c1214f0

1 file changed

Lines changed: 47 additions & 38 deletions

File tree

unpythonic/llist.py

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from abc import ABCMeta, abstractmethod
66
from itertools import zip_longest
77

8-
from unpythonic.fun import composer1
8+
from unpythonic.fun import composeri1
99
from unpythonic.it import foldr, foldl
1010

1111
# explicit list better for tooling support
@@ -182,47 +182,56 @@ def __eq__(self, other):
182182
def __hash__(self):
183183
return hash((hash(self.car), hash(self.cdr)))
184184

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):
187190
if not isinstance(x, cons):
188191
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)
190201
def cdr(x):
191202
"""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")
226235

227236
def ll(*elts):
228237
"""Pack elts to a linked list."""

0 commit comments

Comments
 (0)