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

com.github.leeonky.dal.runtime.DALCollection Maven / Gradle / Ivy

package com.github.leeonky.dal.runtime;

import com.github.leeonky.dal.IndexedElement;

import java.util.Iterator;
import java.util.List;
import java.util.Spliterators;
import java.util.function.Predicate;
import java.util.stream.Stream;

public interface DALCollection extends Iterable> {
    int size();

    E getByIndex(int index);

    int firstIndex();

    DALCollection requireLimitedCollection(String message);

    List collect();

    default DALCollection filter(Predicate predicate) {
        return new IterableDALCollection(() -> Spliterators.iterator(values().filter(predicate).spliterator())) {
            @Override
            public int firstIndex() {
                return DALCollection.this.firstIndex();
            }
        };
    }

    Stream values();

    Stream indexes();

     DALCollection map(IndexedElement.Mapper mapper);

    Stream> stream();

    boolean infinite();

    DALCollection limit(int size);

    class Decorated implements DALCollection {

        private final DALCollection origin;

        public Decorated(DALCollection origin) {
            this.origin = origin;
        }

        @Override
        public int size() {
            return origin.size();
        }

        @Override
        public E getByIndex(int index) {
            return origin.getByIndex(index);
        }

        @Override
        public Iterator> iterator() {
            return origin.iterator();
        }

        @Override
        public int firstIndex() {
            return origin.firstIndex();
        }

        @Override
        public List collect() {
            return origin.collect();
        }

        @Override
        public DALCollection filter(Predicate predicate) {
            return origin.filter(predicate);
        }

        @Override
        public boolean infinite() {
            return origin.infinite();
        }

        @Override
        public DALCollection limit(int size) {
            return origin.limit(size);
        }

        @Override
        public Stream values() {
            return origin.values();
        }

        @Override
        public Stream indexes() {
            return origin.indexes();
        }

        @Override
        public  DALCollection map(IndexedElement.Mapper mapper) {
            return origin.map(mapper);
        }

        @Override
        public Stream> stream() {
            return origin.stream();
        }

        @Override
        public Decorated requireLimitedCollection(String message) {
            origin.requireLimitedCollection(message);
            return this;
        }
    }
}