abstype 'a Queue = Q of 'a list * 'a list 
  with
    val empty = Q([],[]) ;

    fun null( Q([],[]) ) = true
      | null _ = false ;

    fun enq x ( Q([],_) ) = Q( [x] , [] )
      | enq x ( Q(front,back) ) = Q( front , x::back ) ;

    fun deq( Q(_::[],back) ) = Q( rev back , [] )
      | deq( Q(_::rest,back) ) = Q( rest , back )
      | deq( _ ) = empty ;

    fun hd( Q(head::rest,_) ) = SOME head
      | hd( Q([],_) ) = NONE ;
  end ;

enq 0 empty; enq 1 it; deq it ; hd it;

enq 0 empty; enq 1 it; deq it ; deq it ; hd it ;

