public Tuple2<T,BankersQueue<T>> dequeue() { return front.fold(cons->cons.fold((head, tail)->Tuple.tuple(head,tail())) ,nil->{throw new RuntimeException("Unreachable!");}); } public T head(){
public Tuple2<T,BankersQueue<T>> dequeue() { return front.fold(cons->cons.fold((head, tail)->Tuple.tuple(head,tail())) ,nil->{throw new RuntimeException("Unreachable!");}); } public T head(){
public BankersQueue<T> tail() { if(size()==1) return empty(); if(sizeFront==0){ return BankersQueue.ofAll(back.fold(s->s.fold((h, t)->t), n->n)); } if(sizeFront==1){ return ofAll(back); } return new BankersQueue.Cons<>(sizeFront-1,front.fold(s->s.fold((h, t)->t), n->n),sizeBack,back); } public BankersQueue<T> replace(T currentElement, T newElement) {
public BankersQueue<T> tail() { if(size()==1) return empty(); if(sizeFront==0){ return BankersQueue.ofAll(back.fold(s->s.fold((h, t)->t), n->n)); } if(sizeFront==1){ return ofAll(back); } return new BankersQueue.Cons<>(sizeFront-1,front.fold(s->s.fold((h, t)->t), n->n),sizeBack,back); } public BankersQueue<T> replace(T currentElement, T newElement) {