type 'a t = {mutable prev : 'a t option; mutable next : 'a t option; info : 'a} type 'a dlist = {mutable front: 'a t; mutable back: 'a t} exception Bound let next = function {next=Some obj1} -> obj1 | _ -> raise Bound let prev = function {prev=Some obj1} -> obj1 | _ -> raise Bound let takeNext objR = objR:=(next !objR) let takePrev objR = objR:=(prev !objR) let add_before v obj = let newObj = {prev=None;next=Some obj;info=v} in (match obj with {prev=Some obj1} -> (newObj.prev<-Some obj1; obj1.next<-Some newObj) | {prev=None} -> ()); obj.prev<-Some newObj let add_after v obj = let newObj = {next=None;prev=Some obj;info=v} in (match obj with {next=Some obj1} -> (newObj.next<-Some obj1; obj1.prev<-Some newObj) | {next=None} -> ()); obj.next<-Some newObj (* Hmm... I'm not clear whether front is after back or before it. Depends on moving direction:) Let's suppose before *) let push_back v ({back=obj} as data) = add_after v obj; data.back <- next obj let push_front v ({front=obj} as data) = add_before v obj; data.front <- prev obj