(* First expose it in signature *) moduletypeStack = sig type'a t exceptionEmpty val empty : 'a t val is_empty : 'a t -> bool val push : 'a -> 'a t -> 'a t val peek : 'a t -> 'a val pop : 'a t -> 'a t val size : 'a t -> int val pp : (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a t -> unit end
(* Then implement it *) moduleListStack : Stack = struct type'a t = 'alist exceptionEmpty let empty = [] let is_empty = function[] -> true | _ -> false let push x s = x :: s let peek = function[] -> raise Empty | x :: _ -> x let pop = function[] -> raise Empty | _ :: s -> s let size = List.length let pp pp_val fmt s = letopenFormatin let pp_break fmt () = fprintf fmt "@,"in fprintf fmt "@[<v 0>top of stack"; if s <> []then fprintf fmt "@,"; pp_print_list ~pp_sep:pp_break pp_val fmt s; fprintf fmt "@,bottom of stack@]" end