public virtual Type parameterize(Map pars)
{
if (this == Sys.ListType)
{
Type v = (Type)pars.get(FanStr.m_ascii['V']);
if (v == null) throw ArgErr.make("List.parameterize - V undefined").val;
return v.toListOf();
}
if (this == Sys.MapType)
{
Type v = (Type)pars.get(FanStr.m_ascii['V']);
Type k = (Type)pars.get(FanStr.m_ascii['K']);
if (v == null) throw ArgErr.make("Map.parameterize - V undefined").val;
if (k == null) throw ArgErr.make("Map.parameterize - K undefined").val;
return new MapType(k, v);
}
if (this == Sys.FuncType)
{
Type r = (Type)pars.get(FanStr.m_ascii['R']);
if (r == null) throw ArgErr.make("Map.parameterize - R undefined").val;
ArrayList p = new ArrayList();
for (int i='A'; i<='H'; ++i)
{
Type x = (Type)pars.get(FanStr.m_ascii[i]);
if (x == null) break;
p.Add(x);
}
return new FuncType((Type[])p.ToArray(System.Type.GetType("Fan.Sys.Type")), r);
}
throw UnsupportedErr.make("not generic: " + this).val;
}