annotate src/main/java/fj/data/Reader.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj.data;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import fj.F;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import fj.F1Functions;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 * The Reader monad (also called the function monad, so equivalent to the idea of F).
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 * Created by MarkPerry on 7/07/2014.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 public class Reader<A, B> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 private F<A, B> function;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 public Reader(F<A, B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 function = f;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 public F<A, B> getFunction() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 return function;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 public static <A, B> Reader<A, B> unit(F<A, B> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 return new Reader<A, B>(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 public static <A, B> Reader<A, B> constant(B b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 return unit(a -> b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 public B f(A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 return function.f(a);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 public <C> Reader<A, C> map(F<B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 return unit(F1Functions.andThen(function, f));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 public <C> Reader<A, C> andThen(F<B, C> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 return map(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 public <C> Reader<A, C> flatMap(F<B, Reader<A, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 return unit(a -> f.f(function.f(a)).f(a));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 public <C> Reader<A, C> bind(F<B, Reader<A, C>> f) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 return flatMap(f);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 }