Skip to content

Instantly share code, notes, and snippets.

@kmarekspartz
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kmarekspartz/9025551 to your computer and use it in GitHub Desktop.
Save kmarekspartz/9025551 to your computer and use it in GitHub Desktop.
wren/examples/set.wren
class Set {
new {
_list = []
_clean = true
}
new (list) {
if (list is List) {
_list = list
_clean = false
cleanup
} // raise error?
}
cleanup {
// Removes duplicates in the underlying list.
if (!_clean) {
var newList = []
for (element in _list) {
if (!newList.contains(element)) newList.add(element)
}
_list = newList
_clean = true
}
}
add (element) {
_clean = false
_list.add(element)
}
remove (element) {
cleanup // Remove duplicates, so we can return early upon deletion.
for (i in 0.._list.count) {
if (_list[i] == element) {
_list.removeAt(i)
return
}
}
}
contains (element) {
return _list.contains(element)
}
count {
cleanup
return _list.count
}
// I'm not sure on these:
iterate (i) {
cleanup
if (i < count || i >= count) return false
return i + 1
}
iteratorValue (i) {
cleanup
return _list[i]
}
map (f) {
return new Set(_list.map(f))
}
where (f) {
return new Set(_list.where(f))
}
/*| that {
// Union
}*/
+ that {
// A synonym for |
return new Set(_list + that)
// return this | that
}
/* & that {
// Intersection
return new Set(
_list.where(fn (element) {
return that.contains(element)
}) + that.where(fn (element) {
return _list.contains(element)
})
)
} */
- that {
// Set minus
return new Set(
_list.where(
fn (element) {
return (
!that.contains(element))
}))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment