@Override
  public Iterable<MatchResult<T>> matchFromStart(final CharSequence string)
  {
    return new Iterable<MatchResult<T>>()
    {
      public Iterator<MatchResult<T>> iterator()
      {
        return new Iterator<MatchResult<T>>()
        {
          TailMatchIterator tailSequence = new TailMatchIterator(0, string);
          List<MatchResult<?>> next = null;
          boolean returnNull = getMin() == 0;
          
          public boolean hasNext()
          {
            if(returnNull) return true;
            updateNext();
            return null != next;
          }
  
          public MatchResult<T> next()
          {
            if(returnNull)
            {
              returnNull = false;
              return new MatchResult<T>(ChainGrammar.this, string, 0, 0, getNullResult());
            }
            updateNext();
            T result = getResult(next);
            int startIndex = 0;
            int endIndex = 0;
            for(MatchResult<?> r : next)
            {
              assert(0 == r.start);
              endIndex += r.end;
            }
            MatchResult<T> matchResult = new MatchResult<T>(ChainGrammar.this, string, startIndex, endIndex, result);
            next = null;
            return matchResult;
          }

          private void updateNext()
          {
            while (null == next || next.size() < getMin())
            {
              if(!tailSequence.hasNext())
              {
                next = null;
                break;
              }
              next = tailSequence.next();
            }
          }
  
          public void remove()
          {
            throw new RuntimeException("Operation not supported");
          }
        };
      }
    };
  }