123456789101112131415161718192021222324252627282930313233343536373839404142434445(* A queue implemented as a circular double-linked list:
- The root of type ['a t] is represented by a node holding no value.
- The [prev]/[next] pointers forms a loop, with the root acting as a sentinel. *)type'avalue=|Root|Valueof'atype'aelt={value:'avalue;mutableprev:'aelt;mutablenext:'aelt;}type'at='aelt(* Such that its value = Root *)letis_rootq=q.value=Rootletcreate()=letrecroot={value=Root;prev=root;next=root}inrootletaddxq=assert(is_rootq);letelt={value=Valuex;prev=q.prev;next=q}inq.prev.next<-elt;q.prev<-elt;eltletremoveelt=assert(not(is_rootelt));letprev,next=elt.prev,elt.nextinprev.next<-next;next.prev<-prevletiterfq=assert(is_rootq);letreciterfelt=matchelt.valuewith|Root->()|Valuex->fx;iterfelt.nextiniterfq.next