functional programming, JS > python : 자동차 경주

김장훈·2022년 5월 5일
0

fp-with-python

목록 보기
2/3

이번에도 함수형 프래그래밍(응용편) 을 학습하면서 python 으로 전환해보았다.

다만 Promise 등의 개념은 아직 100% 전환은 못하는게 함정...

1. takeWhile, takeUntil

take 의 upgrade 버젼, take 를 하는데 특정 조건만큼 한다

takeWhile: 조건에 어긋나는 순간까지 가져온다

takeUntil: 조건에 맞을때까지 가져온다

@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

2. car racing


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));
  • python

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]
  • python 의 lazy 를 실현시키기 위해선 [*res] 를 꼭 해줘야하는데 이게 맞는지 모르겠다.
profile
읽기 좋은 code란 무엇인가 고민하는 백엔드 개발자 입니다.

0개의 댓글