HasteBin0

Branching Generator Module (V1)

Mar 5th, 2021 (edited)
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.24 KB | None | 0 0
  1. #!/usr/bin/python3
  2. from random import randrange
  3. from statistics import mean as st_mean, median as st_median, mode as st_mode
  4. from typing import Any, Callable, Iterable, Tuple, TypeVar
  5.  
  6. ''' https://pastebin.com/xhfT1njJ '''
  7.  
  8.  
  9. class BranchedGenerator:
  10.     _n: Iterable[int]
  11.     _stop_value: Any
  12.  
  13.     def __init__(self, n: Iterable[int], stop: Any):
  14.         self._n = n
  15.         self._stop_value = stop
  16.  
  17.     @property
  18.     def new(self):
  19.         return
  20.  
  21.  
  22. def wrapper1(f):
  23.     new = (yield)
  24.     # SyntaxError: 'yield' inside generator expression
  25.     yield f((y for _ in new if (y := (yield)) or True))
  26.     return
  27.  
  28.  
  29. _T1 = TypeVar('_T1')
  30. _T2 = TypeVar('_T2')
  31.  
  32.  
  33. def wrapper2(ns: Iterable[_T1], fs: Iterable[Callable[[Iterable[_T1]], _T2]]) -> Tuple[_T2, ...]:
  34.     def has_new():
  35.         while new:
  36.             yield True
  37.         while True:
  38.             yield False
  39.  
  40.     new = True
  41.     xwf = tuple(map(wrapper1, fs))
  42.     for x in xwf:
  43.         next(x)
  44.         x.send(has_new)
  45.         next(x)
  46.     for n in ns:
  47.         for x in xwf:
  48.             x.send(n)
  49.     new = False
  50.     return tuple(map(next, xwf))
  51.  
  52.  
  53. def source(n: int) -> Iterable[int]:
  54.     return (randrange(-9, 9000) for _ in range(n))
  55.  
  56.  
  57. normal = (tuple, st_mean, st_median, st_mode)
  58.  
  59.  
  60. def test0():
  61.     sample = tuple(source(25))
  62.     s_tuple, s_mean, s_median, s_mode = wrapper2(sample, normal)
  63.     b_tuple, b_mean, b_median, b_mode = (f(s_tuple) for f in normal)
  64.     assert all((
  65.         s_tuple == b_tuple,
  66.         s_mean == b_mean,
  67.         s_median == b_median,
  68.         s_mode == b_mode
  69.     ))
  70.  
  71.  
  72. def test1():
  73.     sample = source(25)
  74.     s_tuple, s_mean, s_median, s_mode = wrapper2(sample, normal)
  75.     b_tuple, b_mean, b_median, b_mode = (f(s_tuple) for f in normal)
  76.     print(
  77.         'Test1:'
  78.         '\nTuple', s_tuple, '\n', b_tuple, '\n==?', v0 := s_tuple == b_tuple,
  79.         '\nMean', s_mean, '\n', b_mean, '\n==?', v1 := s_mean == b_mean,
  80.         '\nMedian', s_median, '\n', b_median, '\n==?', v2 := s_median == b_median,
  81.         '\nMode', s_mode, '\n', b_mode, '\n==?', v3 := s_mode == b_mode,
  82.         '\nPasses', ''.join('01'[v * 1] for v in (v0, v1, v2, v3)), 'All?', all((v0, v1, v2, v3))
  83.     )
  84.  
  85.  
  86. if __name__ == '__main__':
  87.     test0()
  88.     test1()
  89.  
Advertisement
Add Comment
Please, Sign In to add comment