Skip to content

Commit 68b90a3

Browse files
committed
checkpoint
1 parent b92670c commit 68b90a3

9 files changed

Lines changed: 96 additions & 36 deletions

File tree

src/main/java/fix/Coalgebra.java renamed to src/main/java/com/jnape/palatable/lambda/recursionschemes/Coalgebra.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package fix;
1+
package com.jnape.palatable.lambda.recursionschemes;
22

33
import com.jnape.palatable.lambda.functions.Fn1;
44
import com.jnape.palatable.lambda.functor.Functor;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.jnape.palatable.lambda.recursionschemes;
2+
3+
import com.jnape.palatable.lambda.adt.hlist.Tuple2;
4+
import com.jnape.palatable.lambda.functor.Functor;
5+
6+
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
7+
8+
public interface Cofree<A, F extends Functor, CofreeF extends Functor<?, F>> {
9+
10+
Tuple2<A, CofreeF> uncofree();
11+
12+
static <A, F extends Functor, CofreeF extends Functor<? extends Cofree<A, F, ?>, F>> Cofree<A, F, CofreeF> coFree(
13+
A a, CofreeF f) {
14+
return () -> tuple(a, f);
15+
}
16+
}
Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package com.jnape.palatable.lambda.recursionschemes;
22

3-
import com.jnape.palatable.lambda.adt.choice.Choice2;
43
import com.jnape.palatable.lambda.adt.coproduct.CoProduct2;
54
import com.jnape.palatable.lambda.functor.Functor;
6-
import fix.Coalgebra;
75

86
import java.util.function.Function;
97

10-
import static com.jnape.palatable.lambda.adt.choice.Choice2.a;
11-
import static com.jnape.palatable.lambda.adt.choice.Choice2.b;
8+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
129
import static com.jnape.palatable.lambda.recursionschemes.builtin.Anamorphism.ana;
1310

1411
/**
@@ -25,12 +22,7 @@
2522
* @param <F> the functor unification type
2623
* @param <FreeF> the type corresponding to the functor that wraps Free
2724
*/
28-
public final class Free<A, F extends Functor, FreeF extends Functor<?, F>> implements CoProduct2<A, FreeF> {
29-
private final Choice2<A, FreeF> choice;
30-
31-
private Free(Choice2<A, FreeF> choice) {
32-
this.choice = choice;
33-
}
25+
public interface Free<A, F extends Functor, FreeF extends Functor<?, F>> extends CoProduct2<A, FreeF> {
3426

3527
/**
3628
* Given a {@link Coalgebra}, recursively fold this <code>Free</code> into a {@link Fix}. Note that this is only
@@ -41,27 +33,12 @@ private Free(Choice2<A, FreeF> choice) {
4133
* @return the fix version of this free
4234
*/
4335
@SuppressWarnings("unchecked")
44-
public <FA extends Functor<A, F>> Fix<F, ? extends Functor<? extends Fix<F, ?>, F>> fix(
36+
default <FA extends Functor<A, F>> Fix<F, ? extends Functor<? extends Fix<F, ?>, F>> fix(
4537
Coalgebra<A, FA> coalgebra) {
4638
return match(a -> ana(coalgebra, a),
4739
freeF -> Fix.fix(freeF.fmap(x1 -> ((Free<A, F, FreeF>) x1).fix(coalgebra))));
4840
}
4941

50-
@Override
51-
public <R> R match(Function<? super A, ? extends R> aFn, Function<? super FreeF, ? extends R> bFn) {
52-
return choice.match(aFn, bFn);
53-
}
54-
55-
@Override
56-
public boolean equals(Object other) {
57-
return other instanceof Free && choice.equals(((Free) other).choice);
58-
}
59-
60-
@Override
61-
public int hashCode() {
62-
return choice.hashCode();
63-
}
64-
6542
/**
6643
* The recursive expression in free construction, using a functor.
6744
*
@@ -71,9 +48,24 @@ public int hashCode() {
7148
* @param <FreeF> the type corresponding to the functor that wraps Free
7249
* @return an instance of Free over this functor
7350
*/
74-
public static <A, F extends Functor, FreeF extends Functor<? extends Free<A, F, ?>, F>> Free<A, F, FreeF> free(
51+
static <A, F extends Functor, FreeF extends Functor<? extends Free<A, F, ?>, F>> Free<A, F, FreeF> free(
7552
FreeF f) {
76-
return new Free<>(b(f));
53+
return new Free<A, F, FreeF>() {
54+
@Override
55+
public <R> R match(Function<? super A, ? extends R> aFn, Function<? super FreeF, ? extends R> bFn) {
56+
return bFn.apply(f);
57+
}
58+
59+
@Override
60+
public boolean equals(Object other) {
61+
return other instanceof Free && ((Free<?, ?, ?>) other).match(constantly(false), f::equals);
62+
}
63+
64+
@Override
65+
public int hashCode() {
66+
return 31 + f.hashCode();
67+
}
68+
};
7769
}
7870

7971
/**
@@ -85,7 +77,23 @@ public int hashCode() {
8577
* @param <FreeF> the type corresponding to the functor that wraps Free
8678
* @return an instance of Free over this value
8779
*/
88-
public static <A, F extends Functor, FreeF extends Functor<?, F>> Free<A, F, FreeF> pure(A a) {
89-
return new Free<>(a(a));
80+
static <A, F extends Functor, FreeF extends Functor<?, F>> Free<A, F, FreeF> pure(A a) {
81+
return new Free<A, F, FreeF>() {
82+
@Override
83+
public <R> R match(Function<? super A, ? extends R> aFn, Function<? super FreeF, ? extends R> bFn) {
84+
return aFn.apply(a);
85+
}
86+
87+
@Override
88+
public boolean equals(Object other) {
89+
return other instanceof Free && ((Free<?, ?, ?>) other).match(a::equals, constantly(false));
90+
}
91+
92+
@Override
93+
public int hashCode() {
94+
return 31 + a.hashCode();
95+
}
96+
};
97+
9098
}
9199
}

src/main/java/com/jnape/palatable/lambda/recursionschemes/builtin/Anamorphism.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import com.jnape.palatable.lambda.functions.Fn1;
44
import com.jnape.palatable.lambda.functions.Fn2;
55
import com.jnape.palatable.lambda.functor.Functor;
6+
import com.jnape.palatable.lambda.recursionschemes.Coalgebra;
67
import com.jnape.palatable.lambda.recursionschemes.Fix;
78
import com.jnape.palatable.lambda.recursionschemes.Thunk;
8-
import fix.Coalgebra;
99

1010
import static com.jnape.palatable.lambda.recursionschemes.Fix.fix;
1111

src/main/java/com/jnape/palatable/lambda/recursionschemes/builtin/Hylomorphism.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.jnape.palatable.lambda.functions.Fn3;
66
import com.jnape.palatable.lambda.functor.Functor;
77
import com.jnape.palatable.lambda.recursionschemes.Algebra;
8-
import fix.Coalgebra;
8+
import com.jnape.palatable.lambda.recursionschemes.Coalgebra;
99

1010
import static com.jnape.palatable.lambda.recursionschemes.builtin.Anamorphism.ana;
1111
import static com.jnape.palatable.lambda.recursionschemes.builtin.Catamorphism.cata;

src/test/java/com/jnape/palatable/lambda/recursionschemes/FreeTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.jnape.palatable.lambda.recursionschemes;
22

3-
import fix.Coalgebra;
43
import org.junit.Test;
54
import testsupport.recursion.ListF;
65
import testsupport.recursion.NatF;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.jnape.palatable.lambda.recursionschemes;
2+
3+
import com.jnape.palatable.lambda.adt.hlist.Tuple2;
4+
import com.jnape.palatable.lambda.functor.Functor;
5+
import testsupport.recursion.NatF;
6+
7+
import java.util.function.Function;
8+
9+
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
10+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
11+
import static com.jnape.palatable.lambda.recursionschemes.Fix.fix;
12+
import static com.jnape.palatable.lambda.recursionschemes.builtin.Catamorphism.cata;
13+
import static testsupport.recursion.NatF.s;
14+
import static testsupport.recursion.NatF.z;
15+
16+
public class Spike {
17+
18+
@SuppressWarnings("unchecked")
19+
public static <A, F extends Functor, Unfixed extends Functor<? extends Fix<F, ?>, F>> A para(
20+
Function<Functor<Tuple2<Fix<F, Unfixed>, A>, F>, A> fn,
21+
Fix<F, Unfixed> fixed) {
22+
Algebra<Functor<Tuple2<Fix<F, Unfixed>, A>, F>, Tuple2<Fix<F, Unfixed>, A>> alg =
23+
f -> tuple(fix((Unfixed) f.fmap(Tuple2::_1)), fn.apply(f));
24+
return cata(alg, fixed)._2();
25+
}
26+
27+
public static void main(String[] args) {
28+
Function<Functor<Tuple2<Fix<NatF, NatF<Fix<NatF, ?>>>, Integer>, NatF>, Integer> x = new Function<Functor<Tuple2<Fix<NatF, NatF<Fix<NatF, ?>>>, Integer>, NatF>, Integer>() {
29+
@Override
30+
public Integer apply(Functor<Tuple2<Fix<NatF, NatF<Fix<NatF, ?>>>, Integer>, NatF> fnat) {
31+
NatF<Tuple2<Fix<NatF, NatF<Fix<NatF, ?>>>, Integer>> xn = (NatF<Tuple2<Fix<NatF, NatF<Fix<NatF, ?>>>, Integer>>) fnat;
32+
return xn.match(constantly(0), s -> s.carrier()._2() + 1);
33+
}
34+
};
35+
System.out.println(para(x, fix(s(fix(z())))));
36+
}
37+
}

src/test/java/com/jnape/palatable/lambda/recursionschemes/builtin/AnamorphismTest.java

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

33
import com.jnape.palatable.lambda.recursionschemes.Algebra;
44
import com.jnape.palatable.lambda.recursionschemes.Fix;
5-
import fix.Coalgebra;
5+
import com.jnape.palatable.lambda.recursionschemes.Coalgebra;
66
import org.junit.Test;
77
import testsupport.recursion.ListF;
88
import testsupport.recursion.NatF;

src/test/java/com/jnape/palatable/lambda/recursionschemes/builtin/HylomorphismTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.jnape.palatable.lambda.recursionschemes.builtin;
22

33
import com.jnape.palatable.lambda.recursionschemes.Algebra;
4-
import fix.Coalgebra;
4+
import com.jnape.palatable.lambda.recursionschemes.Coalgebra;
55
import org.junit.Test;
66
import testsupport.recursion.ListF;
77
import testsupport.recursion.NatF;

0 commit comments

Comments
 (0)