forked from functionaljava/functionaljava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComonad_example.java
More file actions
35 lines (31 loc) · 1.11 KB
/
Copy pathComonad_example.java
File metadata and controls
35 lines (31 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package fj.demo;
import fj.F;
import fj.P;
import static fj.data.List.asString;
import static fj.data.List.fromString;
import fj.data.Stream;
import static fj.data.Stream.join;
import static fj.data.Stream.single;
import fj.data.Zipper;
import static fj.data.Zipper.fromStream;
/**
* Example of using a Zipper comonad to get all the permutations of a String.
*/
public class Comonad_example {
public static void main(final String[] args) {
for (final Stream<Character> p : perms(fromString(args[0]).toStream())) {
System.out.println(asString(p.toList()));
}
}
public static Stream<Stream<Character>> perms(final Stream<Character> s) {
Stream<Stream<Character>> r = single(Stream.<Character>nil());
for (final Zipper<Character> z : fromStream(s))
r = join(z.cobind(new F<Zipper<Character>, Stream<Stream<Character>>>() {
public Stream<Stream<Character>> f(final Zipper<Character> zp) {
return perms(zp.lefts().reverse().append(zp.rights()))
.map(Stream.<Character>cons().f(zp.focus()).o(P.<Stream<Character>>p1()));
}
}).toStream());
return r;
}
}