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

com.xyzwps.lib.dollar.MESeq Maven / Gradle / Ivy

The newest version!
package com.xyzwps.lib.dollar;

import com.xyzwps.lib.dollar.function.Function3;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Function;

import static com.xyzwps.lib.dollar.Helper.*;

public interface MESeq {

    void forEach(BiConsumer consumer);

    default  MESeq mapValues(Function mapValueFn) {
        Objects.requireNonNull(mapValueFn);
        return kv2Consumer -> this.forEach((k, v) -> kv2Consumer.accept(k, mapValueFn.apply(v)));
    }

    default  MESeq mapValues(BiFunction mapValueFn) {
        Objects.requireNonNull(mapValueFn);
        return kv2Consumer -> this.forEach((k, v) -> kv2Consumer.accept(k, mapValueFn.apply(v, k)));
    }

    default  MESeq mapKeys(Function mapKeyFn) {
        Objects.requireNonNull(mapKeyFn);
        final HashSet dedupSet = new HashSet<>();
        return k2vConsumer -> this.forEach((k, v) -> {
            K2 k2 = mapKeyFn.apply(k);
            if (!dedupSet.contains(k2)) {
                dedupSet.add(k2);
                k2vConsumer.accept(k2, v);
            }
        });
    }

    default  MESeq mapKeys(BiFunction mapKeyFn) {
        Objects.requireNonNull(mapKeyFn);
        final HashSet dedupSet = new HashSet<>();
        return k2vConsumer -> this.forEach((k, v) -> {
            K2 k2 = mapKeyFn.apply(k, v);
            if (!dedupSet.contains(k2)) {
                dedupSet.add(k2);
                k2vConsumer.accept(k2, v);
            }
        });
    }

    default MESeq filter(BiPredicate predicateFn) {
        Objects.requireNonNull(predicateFn);
        return kvConsumer -> this.forEach((k, v) -> {
            if (predicateFn.test(k, v)) {
                kvConsumer.accept(k, v);
            }
        });
    }

    default  R reduce(R initValue, Function3 callbackFn) {
        Objects.requireNonNull(callbackFn);
        Holder rHolder = new Holder<>(initValue);
        this.forEach((k, v) -> rHolder.value = callbackFn.apply(rHolder.value, k, v));
        return rHolder.value;
    }

    default HashMap value() {
        HashMap result = new HashMap<>();
        this.forEach(result::put);
        return result;
    }

    default Seq values() {
        return vConsumer -> this.forEach((k, v) -> vConsumer.accept(v));
    }

    default Seq keys() {
        return vConsumer -> this.forEach((k, v) -> vConsumer.accept(k));
    }

    static  MESeq empty() {
        return kvConsumer -> {
        };
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy