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

net.cassite.f.Ptr Maven / Gradle / Ivy

package net.cassite.f;

import io.vertx.core.Future;
import org.jetbrains.annotations.NotNull;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * a container, store data inside the container
 *
 * @param  type of the Ptr
 */
public class Ptr implements ReadablePtr>, WritablePtr, AsTransformable> {
    private Supplier getter;
    private Consumer setter;

    private Ptr(Supplier getter, Consumer setter) {
        this.getter = getter;
        this.setter = setter;
    }

    @SuppressWarnings("unchecked")
    public static  Ptr nil() {
        Object[] t = new Object[]{null};
        return new Ptr<>(() -> (T) t[0], v -> t[0] = v);
    }

    @SuppressWarnings("unchecked")
    public static  Ptr of(@NotNull T value) {
        if (value == null)
            throw new NullPointerException();
        Object[] t = new Object[]{value};
        return new Ptr<>(() -> (T) t[0], v -> t[0] = v);
    }

    public static  Ptr of(@NotNull Supplier getter, @NotNull Consumer setter) {
        if (getter == null)
            throw new NullPointerException();
        if (setter == null)
            throw new NullPointerException();
        return new Ptr<>(getter, setter);
    }

    @SuppressWarnings("unchecked")
    public static  ReadablePtr ofReadonly(@NotNull T value) {
        if (value == null)
            throw new NullPointerException();
        Object[] t = new Object[]{value};
        return new Ptr<>(() -> (T) t[0], v -> {
            throw new UnsupportedOperationException();
        });
    }

    @Override
    public T get() {
        return getter.get();
    }

    @Override
    public Ptr store(@NotNull T t) {
        if (t == null)
            throw new NullPointerException();
        setter.accept(t);
        return this;
    }

    @Override
    public Ptr storeNil() {
        setter.accept(null);
        return this;
    }

    @Override
    public Monad store(@NotNull Future fu) {
        if (fu == null)
            throw new NullPointerException();
        Monad tbd = F.tbd();
        fu.setHandler(r -> {
            if (r.failed()) {
                tbd.fail(r.cause());
            } else {
                T value = r.result();
                setter.accept(value);
                if (value == null) {
                    tbd.complete();
                } else {
                    tbd.complete(value);
                }
            }
        });
        return tbd;
    }

    @Override
    public  Monad unary(@NotNull Function, Future> f) {
        if (f == null)
            throw new NullPointerException();
        return Monad.transform(f.apply(this));
    }

    @Override
    public  Monad bin(@NotNull BiFunction, Future, Future> f, @NotNull Future fu) {
        if (f == null)
            throw new NullPointerException();
        if (fu == null)
            throw new NullPointerException();
        return Monad.transform(f.apply(this, fu));
    }

    // --------- begin primitive transformer -----------
    public static final Misc.IntFunction> Int = ReadablePtr::get;

    public static final Misc.FloatFunction> Float = ReadablePtr::get;

    public static final Misc.LongFunction> Long = ReadablePtr::get;

    public static final Misc.DoubleFunction> Double = ReadablePtr::get;

    public static final Misc.ShortFunction> Short = ReadablePtr::get;

    public static final Misc.ByteFunction> Byte = ReadablePtr::get;

    public static final Misc.BoolFunction> Bool = ReadablePtr::get;

    public static final Misc.CharFunction> Char = ReadablePtr::get;
    // --------- end primitive transformer -----------
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy