Skip to content

Commit dd8a71f

Browse files
committed
+drop and take
1 parent b0602fc commit dd8a71f

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

lambdas/_list.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from ._bool import TRUE, FALSE
1+
from ._bool import TRUE, FALSE, OR
22
from ._pair import CONS, CAR, CDR
33
from ._combinators import Y
4-
from ._natural import INC, GTE
4+
from ._natural import DEC, INC, GTE, ISZERO
55

66

77
LIST = CONS(TRUE)(TRUE)
@@ -53,3 +53,13 @@
5353
(l)
5454
(LIST)
5555
)
56+
DROP = lambda n: lambda l: n(TAIL)(l)
57+
TAKE = Y(lambda f: lambda n: lambda l: (
58+
OR(EMPTY(l))(ISZERO(n))
59+
(lambda _: LIST)
60+
(lambda _: (
61+
PREPEND(f(DEC(n))(TAIL(l)))
62+
(HEAD(l))
63+
))
64+
(TRUE)
65+
))

tests/test_list.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from lambdas import ZERO, ONE, TWO, THREE, FOUR
44
from lambdas import ADD, LTE
5-
from lambdas import LIST, APPEND, PREPEND, REVERSE, MAP, RANGE, REDUCE, FILTER
5+
from lambdas import LIST, APPEND, PREPEND, REVERSE
6+
from lambdas import MAP, RANGE, REDUCE, FILTER, TAKE, DROP
67
from lambdas import decode_number, decode_list
78

89

@@ -97,3 +98,28 @@ def test_filter(given, expected):
9798
result = FILTER(LTE(TWO))(lst)
9899
decoded = [decode_number(n) for n in decode_list(result)]
99100
assert decoded == expected
101+
102+
103+
@pytest.mark.parametrize('given, number, expected', [
104+
([1, 2, 3], ONE, [2, 3]),
105+
])
106+
def test_drop(given, number, expected):
107+
lst = LIST
108+
for el in given:
109+
lst = APPEND(lst)(el)
110+
result = DROP(number)(lst)
111+
assert decode_list(result) == expected
112+
113+
114+
@pytest.mark.parametrize('given, number, expected', [
115+
([1, 2, 3], TWO, [1, 2]),
116+
([1, 2, 3], FOUR, [1, 2, 3]),
117+
([1, 2, 3], ZERO, []),
118+
([], TWO, []),
119+
])
120+
def test_take(given, number, expected):
121+
lst = LIST
122+
for el in given:
123+
lst = APPEND(lst)(el)
124+
result = TAKE(number)(lst)
125+
assert decode_list(result) == expected

tests/test_natural.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from lambdas import TRUE, FALSE
4-
from lambdas import ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX
4+
from lambdas import ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN
55
from lambdas import ADD, INC, MUL, POW, DEC, SUB
66
from lambdas import ISZERO, GTE, LTE, GT, LT, EQ
77
from lambdas import decode_number
@@ -14,6 +14,10 @@
1414
(FOUR, 4),
1515
(FIVE, 5),
1616
(SIX, 6),
17+
(SEVEN, 7),
18+
(EIGHT, 8),
19+
(NINE, 9),
20+
(TEN, 10),
1721
])
1822
def test_numbers(given, expected):
1923
assert decode_number(given) == expected

0 commit comments

Comments
 (0)