Skip to content

Instantly share code, notes, and snippets.

@vrthra
Last active February 20, 2021 07:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vrthra/857a906abc12a0d24bc64ca84331ee7f to your computer and use it in GitHub Desktop.
Save vrthra/857a906abc12a0d24bc64ca84331ee7f to your computer and use it in GitHub Desktop.
pipes in python
import time
class Chains:
def __or__(self, trans):
return trans.source(self)
class Source(Chains):
def __init__(self, i):
self.i = i
def __next__(self):
rv = self.i
self.i += 1
return rv
def __iter__(self):
return self
def source(self):
return Source(self.i)
class Trans(Chains):
def __init__(self, tag):
self.tag = tag
def source(self, src):
self._source = src
return self
def __next__(self):
v = next(self._source)
print(self.tag, '.', v)
return v*10
def __iter__(self):
return self
def trans(self):
t = Trans(self.tag)
return t.source(self._source)
class Inline(Trans):
def __init__(self, tag, nxt):
self.tag = tag
self.__next__ = nxt
p = Source(10)
#for i in p.source():
# print(i)
# j += 1
# if j > 5: break
# time.sleep(1)
v = p | Trans('a') | Trans('b') | Trans('c') | Inline('X', lambda s: next(s._source) * 1000 )
j = 0
for i in v.trans():
print(i)
j += 1
if j > 5: break
time.sleep(1)
class Chains:
def __or__(self, trans):
return trans.source(self)
def __ror__(self, src):
return self.source(S_(src))
def __iter__(self):
return self
def source(self, src):
self._source = src
return self
class S_(Chains):
def __init__(self, nxt): self._source = iter(nxt)
def __next__(self): return next(self._source)
class M_(Chains):
def __init__(self, nxt): self._transform = nxt
def __next__(self):
return self._transform(next(self._source))
class F_(Chains):
def __init__(self, nxt): self._filter = nxt
def __next__(self):
r = next(self._source)
v = self._filter(r)
while not v:
r = next(self._source)
v = self._filter(r)
return r
for i in [i for i in range(10)] | M_(lambda s: s*10) | F_(lambda s: s > 50 )| M_(lambda s: s+1):
print(i)
class Chains:
def __or__(self, src):
s = None
if isinstance(src, set) and callable(list(src)[0]):
s = F_(list(src)[0])
elif isinstance(src, list) and callable(src[0]):
s = M_(src[0])
else:
s = S_(src)
return s.source(self)
def __iter__(self):
return self
def source(self, src):
self._source = src
return self
class S_(Chains):
def __init__(self, nxt): self._source = iter(nxt)
def __next__(self): return next(self._source)
class M_(Chains):
def __init__(self, nxt): self._transform = nxt
def __next__(self):
return self._transform(next(self._source))
class F_(Chains):
def __init__(self, nxt): self._filter = nxt
def __next__(self):
r = next(self._source)
v = self._filter(r)
while not v:
r = next(self._source)
v = self._filter(r)
return r
for i in S_([i for i in range(10)]) | [lambda s: s + 10] | {lambda s: s > 15} | [lambda s: s*10]:
print(i)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment