1
+ package com .jnape .palatable .lambda .recursionschemes ;
2
+
3
+ import fix .Coalgebra ;
4
+ import org .junit .Test ;
5
+ import testsupport .recursion .ListF ;
6
+ import testsupport .recursion .NatF ;
7
+
8
+ import static com .jnape .palatable .lambda .functions .builtin .fn1 .Id .id ;
9
+ import static com .jnape .palatable .lambda .recursionschemes .Fix .fix ;
10
+ import static com .jnape .palatable .lambda .recursionschemes .Free .free ;
11
+ import static com .jnape .palatable .lambda .recursionschemes .Free .pure ;
12
+ import static org .junit .Assert .assertEquals ;
13
+ import static testsupport .recursion .ListF .cons ;
14
+ import static testsupport .recursion .ListF .nil ;
15
+ import static testsupport .recursion .NatF .s ;
16
+ import static testsupport .recursion .NatF .z ;
17
+
18
+ public class FreeTest {
19
+
20
+ @ Test
21
+ @ SuppressWarnings ("unused" )
22
+ public void validTypeSafeSignatures () {
23
+ Free <Integer , NatF , NatF <Free <Integer , NatF , NatF <Free <Integer , NatF , NatF <Free <Integer , NatF , ?>>>>>>> losslessNatFWithPure = free (s (free (s (pure (0 )))));
24
+ Free <Integer , NatF , NatF <Free <Integer , NatF , NatF <Free <Integer , NatF , NatF <Free <Integer , NatF , ?>>>>>>> losslessNatFWithoutPure = free (s (free (s (free (z ())))));
25
+ Free <Integer , NatF , NatF <Free <Integer , NatF , ?>>> compactNatFWithPure = free (s (free (s (pure (0 )))));
26
+ Free <Integer , NatF , NatF <Free <Integer , NatF , ?>>> compactNatFWithoutPure = free (s (free (s (free (z ())))));
27
+ Free <Integer , NatF , ?> minimalNatFWithPure = free (s (free (s (pure (0 )))));
28
+ Free <Integer , NatF , ?> minimalNatFWithoutPure = free (s (free (s (free (z ())))));
29
+
30
+ Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ?>>>>>>>>> losslessListFWithPure = free (cons (3 , free (cons (2 , free (cons (1 , pure (0 )))))));
31
+ Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ?>>>>>>>>> losslessListFWithoutPure = free (cons (3 , free (cons (2 , free (cons (1 , free (nil ())))))));
32
+ Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ?>>> compactListFWithPure = free (cons (3 , free (cons (2 , free (cons (1 , pure (0 )))))));
33
+ Free <Integer , ListF <Integer , ?>, ListF <Integer , Free <Integer , ListF <Integer , ?>, ?>>> compactListFWithoutPure = free (cons (3 , free (cons (2 , free (cons (1 , free (nil ())))))));
34
+ Free <Integer , ListF <Integer , ?>, ?> minimalListFWithPure = free (cons (3 , free (cons (2 , free (cons (1 , pure (0 )))))));
35
+ Free <Integer , ListF <Integer , ?>, ?> minimalListFWithoutPure = free (cons (3 , free (cons (2 , free (cons (1 , free (nil ())))))));
36
+ }
37
+
38
+ @ Test
39
+ public void coproduct () {
40
+ assertEquals (z (), free (z ()).match (id (), id ()));
41
+ assertEquals (0 , pure (0 ).match (id (), id ()));
42
+ }
43
+
44
+ @ Test
45
+ public void foldsIntoFix () {
46
+ Coalgebra <Integer , NatF <Integer >> nats = x -> x == 0 ? z () : s (x - 1 );
47
+ assertEquals (free (s (free (s (free (s (pure (0 ))))))).fix (nats ), fix (s (fix (s (fix (s (fix (z ()))))))));
48
+ assertEquals (free (s (free (s (free (s (pure (1 ))))))).fix (nats ), fix (s (fix (s (fix (s (fix (s (fix (z ()))))))))));
49
+ }
50
+ }
0 commit comments