package com.fasterxml.jackson.datatype.eclipsecollections.deser.list;

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.datatype.eclipsecollections.deser.BaseCollectionDeserializer;
import org.eclipse.collections.api.BooleanIterable;
import org.eclipse.collections.api.ByteIterable;
import org.eclipse.collections.api.CharIterable;
import org.eclipse.collections.api.DoubleIterable;
import org.eclipse.collections.api.FloatIterable;
import org.eclipse.collections.api.IntIterable;
import org.eclipse.collections.api.LongIterable;
import org.eclipse.collections.api.ShortIterable;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.list.primitive.MutableBooleanList;
import org.eclipse.collections.api.list.primitive.MutableByteList;
import org.eclipse.collections.api.list.primitive.MutableCharList;
import org.eclipse.collections.api.list.primitive.MutableDoubleList;
import org.eclipse.collections.api.list.primitive.MutableFloatList;
import org.eclipse.collections.api.list.primitive.MutableIntList;
import org.eclipse.collections.api.list.primitive.MutableLongList;
import org.eclipse.collections.api.list.primitive.MutableShortList;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.factory.primitive.BooleanLists;
import org.eclipse.collections.impl.factory.primitive.ByteLists;
import org.eclipse.collections.impl.factory.primitive.CharLists;
import org.eclipse.collections.impl.factory.primitive.DoubleLists;
import org.eclipse.collections.impl.factory.primitive.FloatLists;
import org.eclipse.collections.impl.factory.primitive.IntLists;
import org.eclipse.collections.impl.factory.primitive.LongLists;
import org.eclipse.collections.impl.factory.primitive.ShortLists;

public final class MutableListDeserializer {
    private MutableListDeserializer() {
    }

    public static final class Ref extends
            BaseCollectionDeserializer.Ref<MutableList<?>, MutableList<Object>> {
        public Ref(JavaType elementType, TypeDeserializer typeDeserializer, JsonDeserializer<?> deserializer) {
            super(MutableList.class, elementType, typeDeserializer, deserializer);
        }

        @Override
        protected MutableList<Object> createIntermediate() {
            return Lists.mutable.empty();
        }

        @Override
        protected MutableList<?> finish(MutableList<Object> objects) {
            return objects;
        }

        @Override
        protected Ref<?, ?> withResolved(
                TypeDeserializer typeDeserializerForValue,
                JsonDeserializer<?> valueDeserializer
        ) {
            return new MutableListDeserializer.Ref(_elementType, typeDeserializerForValue, valueDeserializer);
        }
    }

    public static final class Boolean extends
            BaseCollectionDeserializer.Boolean<MutableBooleanList, MutableBooleanList> {
        public static final MutableListDeserializer.Boolean INSTANCE = new MutableListDeserializer.Boolean();

        public Boolean() {
            super(BooleanIterable.class);
        }

        @Override
        protected MutableBooleanList createIntermediate() {
            return BooleanLists.mutable.empty();
        }

        @Override
        protected MutableBooleanList finish(MutableBooleanList objects) {
            return objects;
        }
    }

    public static final class Byte extends
            BaseCollectionDeserializer.Byte<MutableByteList, MutableByteList> {
        public static final MutableListDeserializer.Byte INSTANCE = new MutableListDeserializer.Byte();

        public Byte() {
            super(ByteIterable.class);
        }

        @Override
        protected MutableByteList createIntermediate() {
            return ByteLists.mutable.empty();
        }

        @Override
        protected MutableByteList finish(MutableByteList objects) {
            return objects;
        }
    }

    public static final class Short extends
            BaseCollectionDeserializer.Short<MutableShortList, MutableShortList> {
        public static final MutableListDeserializer.Short INSTANCE = new MutableListDeserializer.Short();

        public Short() {
            super(ShortIterable.class);
        }

        @Override
        protected MutableShortList createIntermediate() {
            return ShortLists.mutable.empty();
        }

        @Override
        protected MutableShortList finish(MutableShortList objects) {
            return objects;
        }
    }

    public static final class Char extends
            BaseCollectionDeserializer.Char<MutableCharList, MutableCharList> {
        public static final MutableListDeserializer.Char INSTANCE = new MutableListDeserializer.Char();

        public Char() {
            super(CharIterable.class);
        }

        @Override
        protected MutableCharList createIntermediate() {
            return CharLists.mutable.empty();
        }

        @Override
        protected MutableCharList finish(MutableCharList objects) {
            return objects;
        }
    }

    public static final class Int extends
            BaseCollectionDeserializer.Int<MutableIntList, MutableIntList> {
        public static final MutableListDeserializer.Int INSTANCE = new MutableListDeserializer.Int();

        public Int() {
            super(IntIterable.class);
        }

        @Override
        protected MutableIntList createIntermediate() {
            return IntLists.mutable.empty();
        }

        @Override
        protected MutableIntList finish(MutableIntList objects) {
            return objects;
        }
    }

    public static final class Float extends
            BaseCollectionDeserializer.Float<MutableFloatList, MutableFloatList> {
        public static final MutableListDeserializer.Float INSTANCE = new MutableListDeserializer.Float();

        public Float() {
            super(FloatIterable.class);
        }

        @Override
        protected MutableFloatList createIntermediate() {
            return FloatLists.mutable.empty();
        }

        @Override
        protected MutableFloatList finish(MutableFloatList objects) {
            return objects;
        }
    }

    public static final class Long extends
            BaseCollectionDeserializer.Long<MutableLongList, MutableLongList> {
        public static final MutableListDeserializer.Long INSTANCE = new MutableListDeserializer.Long();

        public Long() {
            super(LongIterable.class);
        }

        @Override
        protected MutableLongList createIntermediate() {
            return LongLists.mutable.empty();
        }

        @Override
        protected MutableLongList finish(MutableLongList objects) {
            return objects;
        }
    }

    public static final class Double extends
            BaseCollectionDeserializer.Double<MutableDoubleList, MutableDoubleList> {
        public static final MutableListDeserializer.Double INSTANCE = new MutableListDeserializer.Double();

        public Double() {
            super(DoubleIterable.class);
        }

        @Override
        protected MutableDoubleList createIntermediate() {
            return DoubleLists.mutable.empty();
        }

        @Override
        protected MutableDoubleList finish(MutableDoubleList objects) {
            return objects;
        }
    }
}