package fj.demo; import fj.F1Functions; 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.nil()); for (final Zipper<Character> z : fromStream(s)) r = join(z.cobind(zp -> perms(zp.lefts().reverse().append(zp.rights())).map( F1Functions.o(Stream.<Character>cons().f(zp.focus()), P.p1()) ) ).toStream()); return r; } }