Jaav っぽいの

なんか bleis 先生が関数型っぽいライブラリを Java で作ってるっぽくて、自分も作ってみようかなーって適当に作ってたらとても残念な感じになったのでのっけてみる。

コードは rf0444's jaav at master - GitHub に。
よくもこんなキチ(ry


まずは Function インタフェース。これがないと始まりませんよねー。

public interface Fun<T, R> {
    R _(T x);
}

メソッド名 _ ってw。Jaav もこうらしいw。


続いて Unit。

public enum Unit { _ }

_ 万能説ww。


Function の便利メソッド達。楽しすぎてやばい。(Fun的な意味でw)

public static <T1, T2, T3> Fun<Fun<T2, T3>, Fun<Fun<T1, T2>, Fun<T1, T3>>> compose() {
    return new Fun<Fun<T2,T3>, Fun<Fun<T1,T2>,Fun<T1,T3>>>() {
        @Override
        public Fun<Fun<T1, T2>, Fun<T1, T3>> _(final Fun<T2, T3> f1) {
            return new Fun<Fun<T1,T2>, Fun<T1,T3>>() {
                @Override
                public Fun<T1, T3> _(final Fun<T1, T2> f2) {
                    return new Fun<T1, T3>() {
                        @Override
                        public T3 _(T1 x) {
                            return f1._(f2._(x));
                        }
                    };
                }
            };
        }
    };
}
public static <T1, T2> Fun<Fun<? super T1, ? extends T2>, Fun<T1, T2>> cast() {
    return new Fun<Fun<? super T1,? extends T2>, Fun<T1,T2>>() {
        @Override
        public Fun<T1, T2> _(final Fun<? super T1, ? extends T2> f) {
            return new Fun<T1, T2>() {
                @Override
                public T2 _(T1 x) {
                    return f._(x);
                }
            };
        }
    };
}


Option も作ってみたけど、便利メソッドを関数型ちっくに書こうとして、型推論が出来ないようで全部自分で書くという残念なことに。(まぁこれはこれで面白いww)

public static <T1, T2> Fun<Fun<T1, Option<T2>>, Fun<Option<T1>, Option<T2>>> bind() {
    return new Fun<Fun<T1,Option<T2>>, Fun<Option<T1>,Option<T2>>>() {
        @Override
        public Fun<Option<T1>, Option<T2>> _(final Fun<T1, Option<T2>> f) {
            return new Fun<Option<T1>, Option<T2>>() {
                @Override
                public Option<T2> _(Option<T1> x) {
                    return x.flatMap(f);
                }
            };
        }
    };
}
public static <T> Fun<Option<Option<T>>, Option<T>> join() {
    return Option.<Option<T>, T>bind()._(Funs.<Option<T>>id());
}
public static <T1, T2> Fun<Fun<T1, T2>, Fun<Option<T1>, Option<T2>>> map() {
    return new Fun<Fun<T1,T2>, Fun<Option<T1>,Option<T2>>>() {
        @Override
        public Fun<Option<T1>, Option<T2>> _(final Fun<T1, T2> f) {
            return Option.<T1, T2>bind()._(Funs.<T1, T2, Option<T2>>compose()._(Option.<T2>unit())._(f));
        }
    };
}
public static <T1, T2> Fun<T2, Fun<Fun<T1, T2>, Fun<Option<T1>, T2>>> maybe() {
    return new Fun<T2, Fun<Fun<T1,T2>,Fun<Option<T1>,T2>>>() {
        @Override
        public Fun<Fun<T1, T2>, Fun<Option<T1>, T2>> _(final T2 x) {
            return new Fun<Fun<T1,T2>, Fun<Option<T1>,T2>>() {
                @Override
                public Fun<Option<T1>, T2> _(final Fun<T1, T2> f) {
                    return Funs.<Option<T1>, Option<T2>, T2>compose()._(Option.<T2>getOrElse()._(x))._(Option.<T1, T2>map()._(f));
                }
            };
        }
    };
}
public static <T1, T2 extends T1> Fun<Option<T2>, Option<T1>> cast() {
    return Option.<T2, T1>map()._(Funs.<T2, T1>cast()._(Funs.<T2>id()));
}


あとはリスト系もやろうと思ったけどここまででおなかいっぱいになってやめたww。