代码拉取完成,页面将自动刷新
// Set and FrozenSet types
//
// FIXME preliminary implementation only - doesn't work properly!
package py
var SetType = NewTypeX("set", "set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.", SetNew, nil)
type SetValue struct{}
type Set struct {
items map[Object]SetValue
}
// Type of this Set object
func (o *Set) Type() *Type {
return SetType
}
// Make a new empty set
func NewSet() *Set {
return &Set{
items: make(map[Object]SetValue),
}
}
// Make a new empty set with capacity for n items
func NewSetWithCapacity(n int) *Set {
return &Set{
items: make(map[Object]SetValue, n),
}
}
// Make a new set with the items passed in
func NewSetFromItems(items []Object) *Set {
s := NewSetWithCapacity(len(items))
for _, item := range items {
s.items[item] = SetValue{}
}
return s
}
// Add an item to the set
func (s *Set) Add(item Object) {
s.items[item] = SetValue{}
}
// SetNew
func SetNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) {
var iterable Object
err := UnpackTuple(args, kwargs, "set", 0, 1, &iterable)
if err != nil {
return nil, err
}
if iterable == nil {
return NewSet(), nil
}
// FIXME should be able to initialise from an iterable!
return NewSetFromItems(iterable.(Tuple)), nil
}
var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.")
type FrozenSet struct {
Set
}
// Type of this FrozenSet object
func (o *FrozenSet) Type() *Type {
return FrozenSetType
}
// Make a new empty frozen set
func NewFrozenSet() *FrozenSet {
return &FrozenSet{
Set: *NewSet(),
}
}
// Make a new set with the items passed in
func NewFrozenSetFromItems(items []Object) *FrozenSet {
return &FrozenSet{
Set: *NewSetFromItems(items),
}
}
// Extend the set with items
func (s *Set) Update(items []Object) {
for _, item := range items {
s.items[item] = SetValue{}
}
}
func (s *Set) M__len__() (Object, error) {
return Int(len(s.items)), nil
}
func (s *Set) M__bool__() (Object, error) {
return NewBool(len(s.items) > 0), nil
}
func (s *Set) M__iter__() (Object, error) {
items := make(Tuple, 0, len(s.items))
for item := range s.items {
items = append(items, item)
}
return NewIterator(items), nil
}
// Check interface is satisfied
var _ I__len__ = (*Set)(nil)
var _ I__bool__ = (*Set)(nil)
var _ I__iter__ = (*Set)(nil)
// var _ richComparison = (*Set)(nil)
func (a *Set) M__eq__(other Object) (Object, error) {
b, ok := other.(*Set)
if !ok {
return NotImplemented, nil
}
if len(a.items) != len(b.items) {
return False, nil
}
// FIXME nasty O(n**2) algorithm, waiting for proper hashing!
for i := range a.items {
for j := range b.items {
eq, err := Eq(i, j)
if err != nil {
return nil, err
}
if eq == True {
goto found
}
}
return False, nil
found:
}
return True, nil
}
func (a *Set) M__ne__(other Object) (Object, error) {
eq, err := a.M__eq__(other)
if err != nil {
return nil, err
}
if eq == True {
return False, nil
}
return True, nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。