package com.njzscloud.common.core.tuple;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * 4 元组
 *
 * @param <_0>
 * @param <_1>
 * @param <_2>
 * @param <_3>
 */
public class Tuple4<_0, _1, _2, _3> extends Tuple3<_0, _1, _2> {
    /**
     * 元组大小
     */
    @JsonIgnore
    public final int size = 4;

    /**
     * 第 3 个数据
     */
    protected final _3 _3_;

    /**
     * 构造方法
     *
     * @param _0_ 第 0 个数据
     * @param _1_ 第 1 个数据
     * @param _2_ 第 2 个数据
     * @param _3_ 第 3 个数据
     */
    public Tuple4(_0 _0_, _1 _1_, _2 _2_, _3 _3_) {
        super(_0_, _1_, _2_);
        this._3_ = _3_;
    }

    /**
     * 创建 Tuple4
     *
     * @param _0_ 第 0 个数据
     * @param _1_ 第 1 个数据
     * @param _2_ 第 2 个数据
     * @param _3_ 第 3 个数据
     * @return Tuple3&lt;__0, __1, __2, __3&gt;
     */
    public static <__0, __1, __2, __3> Tuple4<__0, __1, __2, __3> of(__0 _0_, __1 _1_, __2 _2_, __3 _3_) {
        return new Tuple4<>(_0_, _1_, _2_, _3_);
    }

    /**
     * 获取第 3 个数据
     */
    @JsonProperty("3")
    public _3 get_3() {
        return _3_;
    }

    /**
     * <p>按索引获取数据</p>
     * <p>索引越界将返回 null</p>
     *
     * @param index 索引
     * @return T
     */
    @Override
    @SuppressWarnings("unchecked")
    public <T> T get(int index) {
        return switch (index) {
            case 0 -> (T) this._0_;
            case 1 -> (T) this._1_;
            case 2 -> (T) this._2_;
            case 3 -> (T) this._3_;
            default -> null;
        };
    }

    /**
     * 转换成 数组
     *
     * @return Object[]
     */
    @Override
    public Object[] toArray() {
        return new Object[]{this._0_, this._1_, this._2_, this._3_};
    }
}
