All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.smallibs.data.TryHelper Maven / Gradle / Ivy

There is a newer version: 0.11.0
Show newest version
/*
 * HPAS
 * https://github.com/d-plaindoux/hpas
 *
 * Copyright (c) 2016-2017 Didier Plaindoux
 * Licensed under the LGPL2 license.
 */

package org.smallibs.data;

import org.smallibs.control.Functor;
import org.smallibs.control.Monad;
import org.smallibs.type.HK;

import java.util.function.Function;

public enum  TryHelper {
    ;

    public static  Monad> monad(Try aTry) {
        return new TryHelper.Monadic<>(aTry);
    }

    public static  Maybe toMaybe(Try aTry) {
        return aTry.map(Maybe::some).recoverWith(Maybe.none());
    }

    @SuppressWarnings("unchecked")
    private static > HK> specialize(HK app) {
        return (HK>) app;
    }

    @SuppressWarnings("unchecked")
    private static > HK generalize(HK> app) {
        return (HK) app;
    }

    /**
     * @param 
     */
    final static class Monadic implements Monad> {
        private final Try aTry;

        private Monadic(Try aTry) {
            this.aTry = aTry;
        }

        @Override
        public > HK map(Function function) {
            return generalize(new Monadic<>(aTry.map(function)));
        }

        @Override
        public > HK flatmap(Function> function) {
            final Function> tTryFunction = t -> {
                final HK apply = function.apply(t);
                return specialize(apply).self();
            };

            return generalize(new Monadic<>(aTry.flatmap(tTryFunction)));
        }

        @Override
        public  T1 accept(Function>, T1> f) {
            return aTry.accept(f);
        }

        @Override
        public > HK apply(Functor, ?> functor) {
            return generalize(new Monadic<>(aTry.flatmap(a -> {
                final HK map = functor.map(bFunction -> bFunction.apply(a));
                return specialize(map).self();
            })));
        }

        @Override
        public Try self() {
            return aTry;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy