   map.values[key] = value
   map
 
+lookupOrAdd = (map, key, value) ->
+  if existing = map.values[key]
+    existing
+  else
+    map.size++
+    map.values[key] = value
+    value
+
 removeFromSet =
 removeFromMap = (set, key) ->
   return if !set.values[key]?

    (match b
      True (aliased-show something False)
      False (show something)))
  """
  "(== 1 2)", yes

  """recursive overloaded functions safe"""
  """
  Show (class [a]
    show (fn [x] (: (Fn a String))))

  show-string (instance (Show String)
    show (fn [x] x))

  show-bool (instance (Show Bool)
    show (fn [x] "Bool"))

  aliased-show (fn [something b]
    (match b
      True (aliased-show something False)
      False (show something)))

  x (aliased-show "Bool" True)
  y (aliased-show True True)

    # log "pattern", matched.tea, pattern.tea
    unify ctx, matched.tea.type, pattern.tea.type

  constraints = matched.tea.constraints
  # log "pattern compiel", definedNames, pattern
  for {name, id, type} in definedNames
    deps = ctx.deferredNames()
