# Rlist class defined for CS61A at UC Berkeley
# Edited by Mark Miyashita
# http://markmiyashita.com/cs61a
class Rlist(object):
"""A recursive list consisting of a first element and the rest.
>>> s = Rlist(1, Rlist(2, Rlist(3)))
>>> len(s)
3
>>> s[0]
1
>>> s[1]
2
>>> s[2]
3
"""
class EmptyList(object):
def __len__(self):
return 0
empty = EmptyList()
def __init__(self, first, rest=empty):
self.first = first
self.rest = rest
def __repr__(self):
f = repr(self.first)
if self.rest is Rlist.empty:
return 'Rlist({0})'.format(f)
else:
return 'Rlist({0}, {1})'.format(f, repr(self.rest))
def __len__(self):
return 1 + len(self.rest)
def __getitem__(self, i):
if i == 0:
return self.first
return self.rest[i - 1]