replaceTypes = fn replaceType ->
fn
[{type, line, name, args} | types], typesMap ->
case typesMap[name] do
nil -> [{type, line, name, replaceType.(args,typesMap)} | replaceType.(types,typesMap)]
type -> [type | replaceType.(types,typesMap)]
end
[type | types], typesMap -> [type | replaceType.(types, typesMap)]
[], _ -> []
end
end