library OwnersMapping
{

    // map中的一个结构体
    struct itmap
    {
        mapping(address => IndexValue) data; // key-value的结构， key是地址 ，value是一个对象

        uint size;
    }

    // 对象中包括 当前该地址的总量 是否已经加入这个map的标志，类型，已经拥有了的tokenids的结果集
    struct IndexValue {uint256 total;bool isVaild;uint typ; uint256[] tokenIds;}

    // 插入白名单，初始的总量，限制数量
    function insert(itmap storage self, address key, uint typ) internal returns (bool)
    {
        self.data[key].isVaild = true;
        self.data[key].typ = typ;
        self.data[key].total = 0;
        self.size++;
        return true;
    }

    // 获取该白名单地址下的总tokenids的结果集
    function getTokenIds(itmap storage self, address key) internal returns (uint256[] memory)
    {
        return self.data[key].tokenIds;
    }

    // 获取该地址的白名单类型
    function getType(itmap storage self, address key) internal view returns (uint)
    {
        return self.data[key].typ;
    }

    // 每次mint，都会调用下这个add函数，他的总量加一
    function add(itmap storage self, address key, uint256 tokenId) internal returns (bool)
    {
        self.data[key].total = self.data[key].total + 1;
        self.data[key].tokenIds.push(tokenId);
        return true;
    }

    // 保留删除函数，暂时用不到
    function del(itmap storage self, address key, uint256 tokenId) internal returns (bool)
    {
        self.data[key].total = self.data[key].total - 1;
        for (uint256 i; i < self.data[key].tokenIds.length; i++) {
            if (self.data[key].tokenIds[i] == tokenId) {
                delete self.data[key].tokenIds[i];
            }
        }
        return true;
    }

    // 移除白名单
    function remove(itmap storage self, address key) internal returns (bool)
    {
        if (self.data[key].isVaild) {
            self.data[key].isVaild = false;
            self.size --;
            return true;
        }
        return false;
    }

    // 查看白名单是否受限
    function isLimit(itmap storage self, address key) internal view returns (bool)
    {
        return self.data[key].total  <= self.data[key].typ;
    }

    // 用户当前有1个，再买amount个，是否达到白名单的限制
    function isLimitAdd(itmap storage self, address key, uint256 amount) internal view returns (bool)
    {
        return self.data[key].total + amount <= self.data[key].typ;
    }

    // 是否是白名单
    function contains(itmap storage self, address key) internal view returns (bool)
    {
        return self.data[key].isVaild;
    }

    // 查看map的大小
    function getsize(itmap storage self) internal view returns (uint)
    {
        return self.size;
    }
}
// 自己使用建立的一个 map
function insert(itmap storage self, address key, uint typ) internal returns (bool)
    {
        self.data[key].isVaild = true;
        self.data[key].typ = typ;
        self.data[key].total = 0;
        self.size++;
        return true;
    }
// 插入白名单，初始的总量，限制数量