Skip to content

Instantly share code, notes, and snippets.

@AndersDJohnson
Last active June 5, 2019 13:33
Show Gist options
  • Save AndersDJohnson/4116800 to your computer and use it in GitHub Desktop.
Save AndersDJohnson/4116800 to your computer and use it in GitHub Desktop.
Sets in JS
_ = require 'underscore'
class Set
constructor: (opts = {}) ->
@items = {}
@fromArray = (arr) ->
set = new Set()
for item in arr
set.add(item)
return set
intersection: (set) ->
intersectSet = new Set()
for i in @toArray()
if set.has(i)
intersectSet.add(i)
return intersectSet
union: (set) ->
return Set.fromArray( @toArray().concat(set.toArray()) )
toString: ->
return '{' + @toArray().sort().join(', ') + '}'
toJSON: ->
return _.values(@items)
toArray: ->
return _.values(@items)
size: ->
return _.size(@items)
keyPrefix: '_key_'
keyify: (item) ->
return @keyPrefix + JSON.stringify(item).replace(/[\"\']/g, '_')
add: (item) ->
key = @keyify(item)
@items[key] = item
return true
remove: (item) ->
key = @keyify(item)
delete @items[key]
return true
has: (item) ->
key = @keyify(item)
return key of @items
@_powerset = (arr) ->
last = arr[arr.length - 1]
if arr.length is 0
return []
if arr.length is 1
return [[], [last]]
else
ps = []
rest = Set._powerset(arr.slice(0,-1))
for r in rest
ps.push r.concat([last])
ps.push r
return ps
powerset: ->
arr = Set._powerset(@toArray())
sets = ( Set.fromArray(i) for i in arr )
return Set.fromArray(sets)
supersetsWith: (set) ->
sets = []
for item in set.toArray()
unless @has(item)
sets.push Set.fromArray(@toArray().concat(item))
return sets
isSubsetOf: (set) ->
for item in @toArray()
return false unless set.has(item)
return true
isSupersetOf: (set) ->
return set.isSubsetOf(@)
module.exports = Set
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment