From c91e15f6e1597aa96fc5072c2e927f7c39edf124 Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Sat, 21 Nov 2020 16:51:29 -0500 Subject: Add a 'functional' FizzBuzz example --- .../bjc/utils/examples/FunctionalFizzBuzz.java | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 base/src/examples/java/bjc/utils/examples/FunctionalFizzBuzz.java diff --git a/base/src/examples/java/bjc/utils/examples/FunctionalFizzBuzz.java b/base/src/examples/java/bjc/utils/examples/FunctionalFizzBuzz.java new file mode 100644 index 0000000..08551c7 --- /dev/null +++ b/base/src/examples/java/bjc/utils/examples/FunctionalFizzBuzz.java @@ -0,0 +1,71 @@ +package bjc.utils.examples; + +import java.util.function.*; +import bjc.data.*; + +import static bjc.functypes.Combinators.*; + +/** + * @author Ben Culkin + * + */ +public class FunctionalFizzBuzz { + interface FizzBuzzFunc + extends Function, UnaryOperator> { + // Alias type + } + + /** + * Calculate fizz-buzz in an un-functional functional way. + * + * @param args Ignored CLI args + */ + public static void main(String[] args) { + // Do something, at some point + times( + 100, + andThen( + invoke( + introducing( + () -> new IntHolder(), + (holder, arg) -> { + Consumer numSetter2 = (num) -> holder.set(num); + + return (num) -> beforeThis( + numSetter2, + compose( + input -> Integer.toString(input), + strang -> + fbMaker(3, "Fizz", "", holder) + .apply( + fbMaker(5, "Buzz", "", holder) + .apply(ignore -> ignore) + ) + .apply(strang) + ) + ).apply(num); + } + ) + ), + System.out::println + ) + ); + } + + private static FizzBuzzFunc fbMaker( + int cond, String initial, String interleave, IntHolder var) { + return func -> invoke( + iftt( + ignored1 -> var.get() % cond == 0, + arg -> initial + func.apply(interleave), + func + ) + ); + } + + private static Function iftt(Predicate in, + Output ifTrue, + Output ifFalse) { + return (arg) -> in.test(arg) ? ifTrue : ifFalse; + } +} \ No newline at end of file -- cgit v1.2.3