 
   # http://docs.python.org/library/stdtypes.html#set.remove
   remove: (elem) ->
-    if elem not in @value.value
+    if @value.__contains__(elem).value
+      @value.pop(elem)
+    else
       raise new KeyError("#{elem}")
-    else
-      @value.pop(elem)
     return
 
   # http://docs.python.org/library/stdtypes.html#set.symmetric_difference
-  symmetric_difference: (other) ->
-    return @__xor__(other)
+  symmetric_difference: (otherSet) ->
+    return @__xor__(otherSet)
 
   # http://docs.python.org/library/stdtypes.html#set.symmetric_difference_update
-  symmetric_difference_update: (other) ->
-    @__ixor__(other)
+  symmetric_difference_update: (otherSet) ->
+    @__ixor__(otherSet)
     return
 
   # http://docs.python.org/library/stdtypes.html#set.union

  __len__: ->
    return @value.__len__()

  # Checks to see if this is a proper subset of set, meaning this is a subset and not equal to set
  __lt__: (otherSet) ->
    if @__eq__(otherSet).value
      return new Bool(false)
    return @__le__(otherSet)

  # Checks to see if this is not equivalent to set
  __ne__: (set) ->
    return new Bool(not @__eq__(set).value)

  # Returns a new Set containing items from this or set
  __or__: (set) ->
    union = []
    union.push(item) for item in @value.keys()
    union.push(item) for item in set.value.keys()
    return new Set(union)

  # Same as __and__ since intersection is symmetric
  __rand__: (set) ->
    return @__and__(set)
  
  # **Unimplemented**
  __reduce__: ->

  
  # http://docs.python.org/library/stdtypes.html#set.copy
  copy: ->
    keys = @value.keys()
    return new Set(keys)
  
  # http://docs.python.org/library/stdtypes.html#set.difference
