package code.type;

import java.util.Hashtable;
import java.util.Vector;
import static code.type.PredefinedTypes.*;

// Store and map arguments to next holder
class TableHolder extends Holder
{
  Hashtable<TypeExpression, Holder> levelMap =
              new Hashtable<TypeExpression, Holder>();

  TableHolder() {}

  TypeExpression getType(TypeConstructor tType, String name, int ii, TypeExpression ... args)
  {
    assert ii <= args.length;

    Holder aHolder = null;


    if (ii == args.length)     // look for type
    {
      if ((aHolder = levelMap.get(tType)) == null )   // new TCA
      {
        aHolder = new TypeHolder();
        levelMap.put(tType, aHolder);
      }
    }
    else                      // seek argument
    {
      if ((aHolder = levelMap.get(args[ii])) == null )  // new argument
      {
        aHolder = new TableHolder();
        levelMap.put(args[ii], aHolder);
      }
    }
    return aHolder.getType(tType, name, ii + 1, args);
  }

  // Iterate through values contained herein
  void iterate(Vector<TypeExpression> tExprs)
  {
    for (Holder h : levelMap.values())
      h.iterate(tExprs);
  }
}
  


