Skip to content

Instantly share code, notes, and snippets.

@jbr
Created June 6, 2010 01:19
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 jbr/427161 to your computer and use it in GitHub Desktop.
Save jbr/427161 to your computer and use it in GitHub Desktop.
exports.set = function () {
var members = {}
, eachArgument = function (args, fn) { Array.prototype.slice.apply(args).forEach (fn) }
, set = function (item) { return members.hasOwnProperty (item) }
set.has = set
set.union = function (other) {
var union = exports.set.apply ({}, set.members)
union.add.apply (set, other.members)
return union }
set.intersection = function (other) {
var intersection = exports.set ()
set.members.forEach (function (elt) {
if (other (elt)) intersection.add (elt) })
return intersection }
set.add = function () {
eachArgument (arguments, function (arg) { members [arg] = true }) }
set.add.apply (set, arguments)
set.del = function (item) {
eachArgument (arguments, function (arg) { delete members [arg] }) }
set.__defineGetter__ ('members', function () {
var m = []
for (k in members) if (members.hasOwnProperty (k)) m.push (k)
return m })
delete set.size
set.size = function () {return set.members.length}
set.toString = function () { return "<Set:" + set.members.join (",") + ">" }
return set
}
var set = require ('./set').set
, assert = require ('assert')
, sys = require ("sys")
setA = set ('a', 'b', 'c', 'd', 'e')
// setA can be called as a function to check for membership
assert.equal (true, setA ('a'))
assert.equal (false, setA ('q'))
// or, if you prefer:
assert.equal (true, setA.has ('b'))
assert.equal (false, setA.has ('r'))
// to add an element,
setA.add ('r')
assert.equal (true, setA ('r'))
//to remove an element
setA.del ('r')
assert.equal (false, setA ('r'))
//you can add or remove multiple items at a time
setA.add ('p', 'q')
assert.equal (true, setA ('p'))
assert.equal (true, setA ('q'))
setA.del ('p', 'q')
assert.equal (false, setA ('p'))
assert.equal (false, setA ('q'))
// get the full list of set members. this is inefficient.
assert.deepEqual (['a', 'b', 'c', 'd', 'e'], setA.members)
// size
assert.equal (5, setA.size ())
//toString
assert.equal ("<Set:a,b,c,d,e>", setA.toString ())
//and the important set stuff:
setA.add ('a', 'a', 'a')
assert.equal (5, setA.size ())
// unions
setB = set ('c', 'd', 'e', 'f')
union = setA.union (setB)
assert.deepEqual (['a', 'b', 'c', 'd', 'e', 'f'], union.members)
// intersection
intersection = setA.intersection (setB)
assert.deepEqual (['c', 'd', 'e'], intersection.members)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment