Skip to content

Commit 39f79d2

Browse files
committed
IterateT, ListT done right (https://wiki.haskell.org/ListT_done_right)
1 parent d81d235 commit 39f79d2

File tree

9 files changed

+765
-34
lines changed

9 files changed

+765
-34
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
1515
- `MaybeT#or`, choose the first `MaybeT` that represents an effect around `just` a value
1616
- `StateMatcher, StateTMatcher, WriterTMatcher`
1717
- `ReaderT#and`, category composition between `ReaderT` instances: `(a -> m b) -> (b -> m c) -> (a -> m c)`
18+
- `IterateT`, [`ListT` done right](https://wiki.haskell.org/ListT_done_right)
1819

1920
## [5.1.0] - 2019-10-13
2021
### Changed

src/main/java/com/jnape/palatable/lambda/internal/iteration/ImmutableQueue.java renamed to src/main/java/com/jnape/palatable/lambda/internal/ImmutableQueue.java

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.jnape.palatable.lambda.internal.iteration;
1+
package com.jnape.palatable.lambda.internal;
22

33
import com.jnape.palatable.lambda.adt.Maybe;
44

@@ -8,22 +8,29 @@
88
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
99
import static com.jnape.palatable.lambda.functions.builtin.fn3.FoldLeft.foldLeft;
1010

11-
abstract class ImmutableQueue<A> implements Iterable<A> {
11+
/**
12+
* Internal API. Use at your own peril.
13+
*/
14+
public abstract class ImmutableQueue<A> implements Iterable<A> {
1215

13-
abstract ImmutableQueue<A> pushFront(A a);
16+
public abstract ImmutableQueue<A> pushFront(A a);
1417

15-
abstract ImmutableQueue<A> pushBack(A a);
18+
public abstract ImmutableQueue<A> pushBack(A a);
1619

17-
abstract Maybe<A> head();
20+
public abstract Maybe<A> head();
1821

19-
abstract ImmutableQueue<A> tail();
22+
public abstract ImmutableQueue<A> tail();
2023

21-
abstract ImmutableQueue<A> concat(ImmutableQueue<A> other);
24+
public abstract ImmutableQueue<A> concat(ImmutableQueue<A> other);
2225

23-
final boolean isEmpty() {
26+
public final boolean isEmpty() {
2427
return head().fmap(constantly(false)).orElse(true);
2528
}
2629

30+
public static <A> ImmutableQueue<A> singleton(A a) {
31+
return new NonEmpty<>(ImmutableStack.<A>empty().push(a), ImmutableStack.empty());
32+
}
33+
2734
@Override
2835
public Iterator<A> iterator() {
2936
return new Iterator<A>() {
@@ -52,27 +59,27 @@ private static final class Empty<A> extends ImmutableQueue<A> {
5259
private static final Empty<?> INSTANCE = new Empty<>();
5360

5461
@Override
55-
ImmutableQueue<A> pushFront(A a) {
62+
public ImmutableQueue<A> pushFront(A a) {
5663
return new NonEmpty<>(ImmutableStack.<A>empty().push(a), ImmutableStack.empty());
5764
}
5865

5966
@Override
60-
ImmutableQueue<A> pushBack(A a) {
67+
public ImmutableQueue<A> pushBack(A a) {
6168
return pushFront(a);
6269
}
6370

6471
@Override
65-
ImmutableQueue<A> concat(ImmutableQueue<A> other) {
72+
public ImmutableQueue<A> concat(ImmutableQueue<A> other) {
6673
return other;
6774
}
6875

6976
@Override
70-
Maybe<A> head() {
77+
public Maybe<A> head() {
7178
return Maybe.nothing();
7279
}
7380

7481
@Override
75-
ImmutableQueue<A> tail() {
82+
public ImmutableQueue<A> tail() {
7683
return this;
7784
}
7885
}
@@ -87,27 +94,27 @@ private NonEmpty(ImmutableStack<A> outbound, ImmutableStack<A> inbound) {
8794
}
8895

8996
@Override
90-
ImmutableQueue<A> pushFront(A a) {
97+
public ImmutableQueue<A> pushFront(A a) {
9198
return new NonEmpty<>(outbound.push(a), inbound);
9299
}
93100

94101
@Override
95-
ImmutableQueue<A> pushBack(A a) {
102+
public ImmutableQueue<A> pushBack(A a) {
96103
return new NonEmpty<>(outbound, inbound.push(a));
97104
}
98105

99106
@Override
100-
ImmutableQueue<A> concat(ImmutableQueue<A> other) {
107+
public ImmutableQueue<A> concat(ImmutableQueue<A> other) {
101108
return new NonEmpty<>(outbound, foldLeft(ImmutableStack::push, inbound, other));
102109
}
103110

104111
@Override
105-
Maybe<A> head() {
112+
public Maybe<A> head() {
106113
return outbound.head();
107114
}
108115

109116
@Override
110-
ImmutableQueue<A> tail() {
117+
public ImmutableQueue<A> tail() {
111118
ImmutableStack<A> outTail = outbound.tail();
112119
if (!outTail.isEmpty())
113120
return new NonEmpty<>(outTail, inbound);

src/main/java/com/jnape/palatable/lambda/internal/iteration/ImmutableStack.java renamed to src/main/java/com/jnape/palatable/lambda/internal/ImmutableStack.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.jnape.palatable.lambda.internal.iteration;
1+
package com.jnape.palatable.lambda.internal;
22

33
import com.jnape.palatable.lambda.adt.Maybe;
44

@@ -7,17 +7,20 @@
77

88
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
99

10-
abstract class ImmutableStack<A> implements Iterable<A> {
10+
/**
11+
* Internal API. Use at your own peril.
12+
*/
13+
public abstract class ImmutableStack<A> implements Iterable<A> {
1114

12-
final ImmutableStack<A> push(A a) {
15+
public final ImmutableStack<A> push(A a) {
1316
return new Node<>(a, this);
1417
}
1518

16-
abstract Maybe<A> head();
19+
public abstract Maybe<A> head();
1720

18-
abstract ImmutableStack<A> tail();
21+
public abstract ImmutableStack<A> tail();
1922

20-
final boolean isEmpty() {
23+
public final boolean isEmpty() {
2124
return head().fmap(constantly(false)).orElse(true);
2225
}
2326

@@ -49,12 +52,12 @@ private static final class Empty<A> extends ImmutableStack<A> {
4952
private static final Empty<?> INSTANCE = new Empty<>();
5053

5154
@Override
52-
Maybe<A> head() {
55+
public Maybe<A> head() {
5356
return Maybe.nothing();
5457
}
5558

5659
@Override
57-
ImmutableStack<A> tail() {
60+
public ImmutableStack<A> tail() {
5861
return this;
5962
}
6063
}
@@ -69,12 +72,12 @@ public Node(A head, ImmutableStack<A> tail) {
6972
}
7073

7174
@Override
72-
Maybe<A> head() {
75+
public Maybe<A> head() {
7376
return Maybe.just(head);
7477
}
7578

7679
@Override
77-
ImmutableStack<A> tail() {
80+
public ImmutableStack<A> tail() {
7881
return tail;
7982
}
8083
}

src/main/java/com/jnape/palatable/lambda/internal/iteration/ConcatenatingIterable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jnape.palatable.lambda.internal.iteration;
22

3+
import com.jnape.palatable.lambda.internal.ImmutableQueue;
4+
35
import java.util.Iterator;
46

57
import static com.jnape.palatable.lambda.functions.builtin.fn1.Flatten.flatten;

src/main/java/com/jnape/palatable/lambda/internal/iteration/TrampoliningIterator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.jnape.palatable.lambda.functions.Fn0;
44
import com.jnape.palatable.lambda.functions.Fn1;
55
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
6+
import com.jnape.palatable.lambda.internal.ImmutableQueue;
67

78
import java.util.Iterator;
89
import java.util.NoSuchElementException;

0 commit comments

Comments
 (0)