       params: map validIdentifier, params
       body: translateIr ctx, body)])
 
+
+irMap = (keys, elems) ->
+  {ir: irMapTranslate, keys, elems}
+
+irMapTranslate = (ctx, {keys, elems}) ->
+  (jsCall "Immutable.Map", [(jsArray (map jsArray, (zip keys, elems)))])
+
+
+irSet = (items) ->
+  {ir: irSetTranslate, items}
+
+irSetTranslate = (ctx, {items}) ->
+  (jsCall "Immutable.Set", items)
+
+
 isTypeConstraint = (expression) ->
   (isCall expression) and (':' is _symbol _operator expression)
 

# Add library to compile for running macros
eval library

# JS Reserved words

reservedInJs = newSetWith ("abstract arguments boolean break byte case catch char class " +


    callTyping ctx, call
    assignCompile ctx, call, (jsBinary "===", compiledA, compiledB)

ms.Set = ms_Set = (ctx, call) ->
  if hashset = ctx.assignTo()
    # TODO:
    throw new Error "matching on sets not supported yet"
  else
    items = _arguments call
    compiledItems = uniformCollectionCompile ctx, call, items, hashsetType
    assignCompile ctx, call, (irSet compiledItems)

# Before assign the correct type to plus
# ms['+'] = ms_plus = (ctx, call) ->
