/*
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
*/
import util.metaProperty
class Set{
ctor(t,...){
if(type(t)!="table") t = {t,...}
this = ..table.unique(t)
}
@_metaProperty;
}
namespace Set{
var pop = ..table.pop;
var find = ..table.find;
var push = ..table.push;
var remove = ..table.remove;
_metaProperty = ..util.metaProperty(
add = function(v,...){
if(type(v)!="table") v = {v,...}
owner = reduce(v,function(p,n){
if(!find(p,n) ) push(p,n)
return p
},owner)
return owner;
}
delete = function(v){
return !!remove(owner, find(owner,v)||0)
}
has = function(v){
return !!find(owner, v);
}
clear = function(){
pop(owner,#owner)
}
size = { _get = lambda() #owner };
)
}
// 测试代码
if(owner) return ;
import console
var set = Set({1,1,3,4,4,5});
console.varDump( set )
// 添加某个值,返回 Set 结构本身
set.add(8,"4",9).add(18)
// 删除某个值,返回一个布尔值,表示删除是否成功
console.varDump( set.delete(4) )
// 返回一个布尔值,表示该值是否为 Set 的成员
console.varDump( set.has(4) )
// 清除所有成员,没有返回值
set.clear()
set.add(999,,888,,777)
//返回Set实例的成员总数
console.log( set.size )
console.varDump( set )
console.pause(true);