class Seq<Token,Result1,Result2> 
    implements Parser<Token,Pair<Result1,Result2>>{
    Parser<Token,Result1> p1;

    Parser<Token,Result2> p2;
    Seq(Parser<Token,Result1> p1,Parser<Token,Result2> p2){
	this.p1=p1;this.p2=p2;
    }
    
    public 
    Pair<Pair<Result1,Result2>,Li<Token>> parse(Li<Token> xs){
	Pair<Result1,Li<Token>> r1= p1.parse(xs);
	if (r1==null) return null;
	Pair<Result2,Li<Token>> r2 = p2.parse(r1.snd);
	if (r2==null) return null;
	return new Pair<Pair<Result1,Result2>,Li<Token>>
           (new Pair<Result1,Result2>(r1.fst,r2.fst),r2.snd);
    }

  public static void main(String [] args){
      Parser<Character,Character> p1
        = new Atom<Character>('{');
      Parser<Character,Character> p2
        = new Atom<Character>('}');
   Parser<Character,Pair<Character,Character>> p12
     = new Seq<Character,Character,Character>(p1,p2);
   Li<Character> xs
    =new Li<Character>('{'
    ,new Li<Character>('}'
    ,new Li<Character>('ü'
    ,new Li<Character>())));
   System.out.println(p12.parse(xs));
  }

} 
