1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.functor.example.kata.four;
18
19 import java.io.InputStream;
20 import java.io.InputStreamReader;
21 import java.io.Reader;
22
23 import org.apache.commons.functor.BinaryFunction;
24 import org.apache.commons.functor.UnaryFunction;
25 import org.apache.commons.functor.adapter.BinaryFunctionUnaryFunction;
26 import org.apache.commons.functor.core.IsNull;
27 import org.apache.commons.functor.core.LeftIdentity;
28 import org.apache.commons.functor.core.RightIdentity;
29 import org.apache.commons.functor.core.algorithm.FoldLeft;
30 import org.apache.commons.functor.core.comparator.IsLessThan;
31 import org.apache.commons.functor.core.composite.Composite;
32 import org.apache.commons.functor.core.composite.Conditional;
33 import org.apache.commons.functor.core.composite.ConditionalBinaryFunction;
34 import org.apache.commons.functor.example.kata.one.Subtract;
35 import org.apache.commons.functor.example.lines.Lines;
36 import org.apache.commons.functor.generator.FilteredGenerator;
37
38
39
40
41
42
43
44
45
46 public class DataMunger {
47
48 public static final Object process(final InputStream file, final int selected, final int col1, final int col2) {
49 return process(new InputStreamReader(file),selected,col1,col2);
50 }
51
52
53
54
55
56
57 public static final Object process(final Reader file, final int selected, final int col1, final int col2) {
58 return NthColumn.instance(selected).evaluate(
59 new FoldLeft<String>(lesserSpread(col1, col2)).evaluate(new FilteredGenerator<String>(Lines.from(file),
60 Composite.predicate(IsInteger.instance(),NthColumn.instance(0)))));
61 }
62
63
64
65
66
67
68
69 private static final BinaryFunction<String, String, String> lesserSpread(final int col1, final int col2) {
70 return new ConditionalBinaryFunction<String, String, String>(
71 IsNull.<String>left(),
72 RightIdentity.<String, String>function(),
73 Conditional.function(
74 Composite.predicate(
75 IsLessThan.instance(),
76 absSpread(col1,col2),
77 absSpread(col1,col2)),
78 LeftIdentity.<String, String>function(),
79 RightIdentity.<String, String>function()
80 )
81 );
82 }
83
84
85
86
87
88
89 private static UnaryFunction<String, Integer> absSpread(final int col1, final int col2) {
90 return Composite.function(
91 Abs.instance(),
92 new BinaryFunctionUnaryFunction<String, Number>(
93 Composite.function(
94 Subtract.instance(),
95 Composite.function(ToInteger.instance(),NthColumn.instance(col1)),
96 Composite.function(ToInteger.instance(),NthColumn.instance(col2)))
97 ));
98 }
99
100 }