Facebook
From Hot Shama, 6 Years ago, written in OCaml (Objective Caml).
This paste is a reply to Untitled from Ivory Earthworm - go back
Embed
Viewing differences between Untitled and Re: Untitled
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
                                                                                
begin c.a <- None;
                                                                                e
                                                                        
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;;