이번에도 함수형 프래그래밍(응용편) 을 학습하면서 python 으로 전환해보았다.
다만 Promise 등의 개념은 아직 100% 전환은 못하는게 함정...
@curry
def lazy_take_while(func: Callable, iterable: iter):
for value in iterable:
if func(value):
yield value
else:
break
@curry
def lazy_take_until(func: Callable, iterable: iter):
for value in iterable:
yield value
if func(value):
break
const track = [
{ cars: ['철수', '영희', '철희', '영수'] },
{ cars: ['하든', '커리', '듀란트', '탐슨'] },
{ cars: ['폴', '어빙', '릴라드', '맥컬럼'] },
{ cars: ['스파이더맨', '아이언맨'] },
{ cars: [] }
];
_.go(
L.range(Infinity),
L.map(i => track[i]),
L.map(({cars}) => cars),
L.map(_.delay(2000)),
L.takeWhile(({length: l}) => l == 4),
// L.takeUntil(({length: l}) => l < 4),
L.flat,
L.map(car => `${car} 출발!`),
_.each(console.log));
def test_car_racing_should_work():
track = [
{"cars": ["A", "B", "C", "D"]},
{"cars": ["E", "F", "G", "H"]},
{"cars": ["I", "J", "K", "L"]},
{"cars": ["AK", "AB"]},
{"cars": []},
]
res = go(
range(10),
lazy_map(lambda index: track[index]),
lazy_map(lambda data: data["cars"]),
lazy_take_while(lambda cars: len(cars) == 4), # 조건이 아니면 멈춘다.
# lazy_take_until(lambda cars: len(cars) == 0), # 조건 만날때가지 돌아간다.
lazy_flatten,
lazy_map(lambda car: f"{car} 출발"),
lazy_each(print),
)
assert [*res]