module type Container = sig type 'a t exception Empty of string val create: unit -> 'a t val put: 'a * 'a t -> unit val take: 'a t -> 'a end;; module ContainerList = struct type 'a t = {mutable a : 'a list } exception Empty of string let create() = { a = [] } let put (e, c) = match c.a with | [] -> begin c.a <- [e] end | h::t -> begin c.a <- c.a@[e] end let take c = match c.a with | [] -> raise (Empty "e") | h::t -> begin c.a <- t ; h end end;; let cL = ContainerList.create();; ContainerList.put(1, cL);; ContainerList.put(2, cL);; ContainerList.put(3, cL);; ContainerList.take cL;;