Created
June 6, 2010 01:19
-
-
Save jbr/427161 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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