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

org.davidmoten.kool.internal.operators.maybe.MaybeFlatMap Maven / Gradle / Ivy

package org.davidmoten.kool.internal.operators.maybe;

import java.util.NoSuchElementException;
import java.util.Optional;

import org.davidmoten.kool.Maybe;
import org.davidmoten.kool.Stream;
import org.davidmoten.kool.StreamIterable;
import org.davidmoten.kool.StreamIterator;
import org.davidmoten.kool.function.Function;
import org.davidmoten.kool.internal.util.EmptyStream;

import com.github.davidmoten.guavamini.Preconditions;

public final class MaybeFlatMap implements Stream {

    private final Maybe maybe;
    private final Function> mapper;

    public MaybeFlatMap(Maybe maybe, Function> mapper) {
        this.maybe = maybe;
        this.mapper = mapper;
    }

    @Override
    public StreamIterator iterator() {
        return new StreamIterator() {

            StreamIterator it;
            boolean finished;

            @Override
            public boolean hasNext() {
                load();
                return !finished && Preconditions.checkNotNull(it.hasNext());
            }

            @Override
            public R next() {
                load();
                if (finished) {
                    throw new NoSuchElementException();
                } else {
                    return it.next();
                }
            }

            @Override
            public void dispose() {
                if (it != null) {
                    it.dispose();
                    it = null;
                    finished = true;
                }
            }

            @SuppressWarnings("unchecked")
            private void load() {
                if (!finished && it == null) {
                    Optional v = maybe.get();
                    if (v.isPresent()) {
                        it = mapper.applyUnchecked(v.get()).iterator();
                    } else {
                        it = (StreamIterator) EmptyStream.INSTANCE.iterator();
                    }
                }
            }
        };
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy