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