Advertisement
Guest User

Untitled

a guest
Jul 12th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.10 KB | None | 0 0
  1.  
  2. (* indexed type *)
  3. module type IX = sig
  4.   type 'a t
  5. end
  6.  
  7. (* type-aware comparison *)
  8. type (_, _) cmp
  9.   = Eq: ('a, 'a) cmp
  10.   | Lt: ('a, 'b) cmp
  11.   | Gt: ('a, 'b) cmp
  12.  
  13. module type IX_COMPARE = sig
  14.   include IX
  15.   val compare: 'a t -> 'b t -> ('a, 'b) cmp
  16. end
  17.  
  18. (* indexed maps (binary tree) *)
  19. module Make_ix_map (K: IX_COMPARE) (V: IX): sig
  20.   type 'a key = 'a K.t
  21.   type 'a value = 'a V.t
  22.   type t
  23.  
  24.   val empty: t
  25.   val add: 'a key -> 'a value -> t -> t
  26.   val find: 'a key -> t -> 'a value option
  27.  
  28. end = struct
  29.   type 'a key = 'a K.t
  30.   type 'a value = 'a V.t
  31.   type t =
  32.     | Empty: t
  33.     | Node: t * 'a key * 'a value * t -> t
  34.  
  35.   let empty = Empty
  36.  
  37.   type pair = Pair: 'a K.t * 'a V.t -> pair
  38.   let rec addp (Pair (k, v)) = function
  39.     | Empty -> Node (Empty, k, v, Empty)
  40.     | Node (left, k', v', right) ->
  41.        match K.compare k k' with
  42.        | Eq -> Node (left, k, v, right)
  43.        | Lt -> let left' = addp (Pair (k, v)) left in
  44.                Node (left', k', v', right)
  45.        | Gt -> let right' = addp (Pair (k, v)) left in
  46.                Node (left, k', v', right')
  47.   let add k v t = addp (Pair (k, v)) t
  48.  
  49.   type 'r search = Search: 'a K.t * ('a V.t -> 'r) -> 'r search
  50.   let rec finds (Search (k, f)) = function
  51.     | Empty -> None
  52.     | Node (left, k', v, right) ->
  53.        match K.compare k k' with
  54.        | Eq -> Some (f v)
  55.        | _ ->
  56.           match finds (Search (k, f)) left with
  57.           | Some r -> Some r
  58.           | None -> finds (Search (k, f)) right
  59.   let find k t = finds (Search (k, fun x -> x)) t
  60. end
  61.  
  62. (*-------------------------------------------------*)
  63.  
  64. type 'a prop
  65.   = Text: string prop
  66.   | Size: int prop
  67.  
  68. module Prop = struct
  69.   type 'a t = 'a prop
  70.   let compare (type a b) (p: a prop) (q: b prop): (a, b) cmp =
  71.     match p, q with
  72.     | Text, Text -> Eq
  73.     | Size, Size -> Eq
  74.     | Size, Text -> Lt
  75.     | Text, Size -> Gt
  76. end
  77.  
  78. module Id = struct type 'a t = 'a end
  79.  
  80. module PropMap = Make_ix_map(Prop)(Id)
  81.  
  82. let get_size: PropMap.t -> int option =
  83.   PropMap.find Size
  84.  
  85. let get_text: PropMap.t -> string option =
  86.   PropMap.find Text
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement