Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
logging_infra.ml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60module type Data_type = sig type t val make : string -> t option -> t val root : t end module MakeTree(D: Data_type) = struct module SMap = Map.Make ( struct type t = string let compare = String.compare end) type t = Node of D.t * t SMap.t type _t = {mutable data : t} let internal = {data= Node (D.root, SMap.empty )} let make_part_name a b = let open Printf in if a = "" then b else sprintf "%s.%s" a b let get s = let path = String.split_on_char '.' s in let rec get_aux path (current_node :t) current_name : (D.t * t) = match path, current_node with | h :: [], Node (l, children) -> if SMap.mem h children then let Node (logger,_) = SMap.find h children in (logger, Node (l, children)) else let logger = D.make (make_part_name current_name h) (Some l) in let new_leaf = Node (logger, SMap.empty) in (logger, Node (l, SMap.add h new_leaf children)) | h :: t, Node (l, children) -> if SMap.mem h children then let logger, new_child = get_aux t (SMap.find h children) (make_part_name current_name h) in (logger, Node (l, SMap.add h new_child children)) else let temp_logger = D.make (make_part_name current_name h) (Some l) in let new_leaf = Node (temp_logger, SMap.empty) in let logger, new_child = get_aux t new_leaf (make_part_name current_name h) in (logger, Node (l, SMap.add h new_child children)) | [], Node (l, children) -> l, Node (l, children) in let res, new_item = get_aux path internal.data "" in internal.data <- new_item; res end