diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java new file mode 100644 index 0000000..6ff6301 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessor.java @@ -0,0 +1,25 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator; + +import java.util.Arrays; +import java.util.function.UnaryOperator; + +@FunctionalInterface +public interface TextProcessor extends UnaryOperator { + + default TextProcessor chain(TextProcessor after) { + return input -> after.apply(this.apply(input)); + } + + static TextProcessor identity() { + return s -> s; + } + + static TextProcessor of(TextProcessor processor) { + return processor; + } + + static TextProcessor of(TextProcessor... processors) { + return Arrays.stream(processors) + .reduce(TextProcessor.identity(), TextProcessor::chain); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java new file mode 100644 index 0000000..dcd864e --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/structural/decorator/TextProcessorTest.java @@ -0,0 +1,26 @@ +package pl.mperor.lab.java.design.pattern.structural.decorator; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TextProcessorTest { + + @Test + public void shouldAllowToCreateTextProcessorAsChainOfFunctions() { + Assertions.assertEquals("prefix@Hello World@suffix", + TextProcessor.of(String::strip) + .chain(s -> "prefix" + s) + .chain(s -> s + "suffix") + .apply(" @Hello World@") + ); + + Assertions.assertEquals("HEX", + TextProcessor.of( + String::toUpperCase, + s -> s.replace("L", "X"), + s -> s.substring(0, 3) + ).apply("Hello World") + ); + } + +}