module type Container = sig type 'a t exception Empty of string exception Full of string val create: unit -> 'a t val put: 'a * 'a t -> unit val take: 'a t -> 'a end;; module ContainerOption = struct type 'a t = { mutable a : 'a option } exception Empty of string exception Full of string let create() = { a = None } let put (e, c) = match c.a with | None -> (c.a <- Some e) | _ -> raise(Full "f") let take c = match c.a with | None -> raise(Empty "e") | Some e -> begin c.a <- None; e end end;; let cO = ContainerOption.create();; ContainerOption.put(1, cO);; ContainerOption.take cO;; module ContainerList = struct type 'a t = { mutable n : int; mutable a : 'a list } exception Empty of string exception Full of string let create() = { n = 0; a = [] } let put (e, c) = match c.n with | 0 -> begin c.a <- [e]; c.n <- c.n + 1 end | _ -> raise (Full "f") let take c = match c.n with | 0 -> raise (Empty "e") | _ -> begin c.n <- c.n - 1; c.a end end;; let cL = ContainerList.create();; ContainerList.put(1, cL);; ContainerList.take cL;;