package at.yawk.numaec;

import org.eclipse.collections.api.DoubleIterable;
import org.eclipse.collections.api.factory.list.primitive.MutableDoubleListFactory;

import java.util.stream.DoubleStream;

public class MutableDoubleBufferListFactory implements MutableDoubleListFactory {
    private final LargeByteBufferAllocator allocator;

    private MutableDoubleBufferListFactory(LargeByteBufferAllocator allocator) {
        this.allocator = allocator;
    }

    public static MutableDoubleBufferListFactory withAllocator(LargeByteBufferAllocator allocator) {
        return new MutableDoubleBufferListFactory(allocator);
    }

    @Override
    public MutableDoubleBufferList empty() {
        return new DoubleBufferListImpl.Mutable(allocator);
    }

    public MutableDoubleBufferList emptyWithInitialCapacity(int initialCapacity) {
        return new DoubleBufferListImpl.Mutable(allocator, initialCapacity);
    }

    @Override
    public MutableDoubleBufferList of() {
        return empty();
    }

    @Override
    public MutableDoubleBufferList with() {
        return empty();
    }

    @Override
    public MutableDoubleBufferList of(double... items) {
        MutableDoubleBufferList list = emptyWithInitialCapacity(items.length);
        list.addAll(items);
        return list;
    }

    @Override
    public MutableDoubleBufferList with(double... items) {
        return of(items);
    }

    @Override
    public MutableDoubleBufferList ofAll(DoubleIterable items) {
        MutableDoubleBufferList list = emptyWithInitialCapacity(items.size());
        list.addAll(items);
        return list;
    }

    @Override
    public MutableDoubleBufferList withAll(DoubleIterable items) {
        return ofAll(items);
    }

    @Override
    public MutableDoubleBufferList ofAll(Iterable<Double> iterable) {
        MutableDoubleBufferList list = of();
        for (Double element : iterable) {
            list.add(element);
        }
        return list;
    }

    @Override
    public MutableDoubleBufferList withAll(Iterable<Double> iterable) {
        return ofAll(iterable);
    }

    @Override
    public MutableDoubleBufferList ofAll(DoubleStream stream) {
        MutableDoubleBufferList list = of();
        stream.forEach(list::add);
        return list;
    }

    @Override
    public MutableDoubleBufferList withAll(DoubleStream stream) {
        return ofAll(stream);
    }
}