11from functools import partial , reduce
2+ from itertools import product , islice
23from .util import flip
4+ from .composable import compose
35
46class infix (partial ):
57 def __truediv__ (self , right ):
@@ -12,26 +14,64 @@ def __rtruediv__(self, left):
1214contains = infix (lambda lst , item : item in lst )
1315pair = infix (lambda a , b : (a , b ))
1416join = infix (lambda lst , s : s .join (lst ))
15- x = infix (lambda l1 , l2 : list (map (lambda x , y : x * y , l1 , l2 )))
1617hasattr = infix (hasattr )
1718fmap = infix (flip (map ))
1819ffilter = infix (flip (filter ))
1920freduce = infix (flip (reduce ))
21+ take = infix (compose (list , islice ))
22+
23+ INF = float ('inf' )
24+
25+ class To :
26+ def __init__ (self , start , end ):
27+ if start / of / int and (end / of / int or end == INF ):
28+ self .type = 'number'
29+ self .start = start
30+ self .curr = self .start
31+ self .end = end
32+ elif start / of / str and end / of / str :
33+ self .type = 'char'
34+ self .start = start
35+ self .curr = self .start
36+ self .end = end
37+ else :
38+ raise TypeError ('Unknown range: %s to %s' % (start , end ))
39+
40+ def __mul__ (self , rhs ):
41+ return product (self , rhs )
42+
43+ def __iter__ (self ):
44+ return self
45+
46+ def __next__ (self ):
47+ if self .type == 'number' :
48+ if self .curr <= self .end :
49+ ret = self .curr
50+ self .curr += 1
51+ return ret
52+ else :
53+ raise StopIteration
54+ elif self .type == 'char' :
55+ if ord (self .curr ) <= ord (self .end ):
56+ ret = self .curr
57+ self .curr = chr (ord (self .curr ) + 1 )
58+ return ret
59+ else :
60+ raise StopIteration
61+ else :
62+ raise StopIteration
63+
64+ def __str__ (self ):
65+ if self .type == 'number' :
66+ return super (To , self ).__str__ ()
67+ elif self .type == 'char' :
68+ return '' .join (self )
69+ else :
70+ raise NotImplementedError
2071
2172@infix
2273def to (start , end ):
23- if start / of / int and end / of / int :
24- return range (start , end + 1 )
25- elif start / of / str and end / of / str :
26- ret = ''
27- i = ord (start )
28- while i <= ord (end ):
29- ret += chr (i )
30- i += 1
31- return ret
32- else :
33- raise TypeError ('Unknown range: %s to %s' % (start , end ))
34-
74+ return To (start , end )
3575
3676__all__ = [
3777 'infix' ,
@@ -40,9 +80,10 @@ def to(start, end):
4080 'pair' ,
4181 'join' ,
4282 'to' ,
43- 'x ' ,
83+ 'INF ' ,
4484 'hasattr' ,
4585 'fmap' ,
4686 'freduce' ,
4787 'ffilter' ,
88+ 'take' ,
4889]
0 commit comments