[ocaml] OCaml LZW

Viewer

copydownloadembedprintName: OCaml LZW
  1. let chain (: '-> unit) : '-> '=
  2.   fun x -> f x ; x
  3.  
  4. module type Encoder_dict = sig
  5.   type t
  6.   val reset_code : int
  7.   val make       : unit -> t
  8.   val add        : t -> string -> unit
  9.   val mem        : t -> string -> bool
  10.   val find       : t -> string -> int
  11.   val is_full    : t -> bool
  12.   val reset      : t -> unit
  13. end
  14.  
  15. module Encoder (Dict : Encoder_dict) = struct
  16.  
  17.   module State = struct
  18.     type t =
  19.       { seq   : string
  20.       ; token : string }
  21.   end
  22.  
  23.   module Change = struct
  24.     type t =
  25.       | Found     of found
  26.       | Not_found of not_found
  27.       | Overflow  of overflow
  28.     and found =
  29.       { seq : string }
  30.     and not_found =
  31.       { seq     : string
  32.       ; new_seq : string
  33.       ; code    : int }
  34.     and overflow =
  35.       { seq  : string
  36.       ; code : int }
  37.   end
  38.  
  39.   type mem     = string -> bool
  40.   type find    = string -> int
  41.   type is_full = unit -> bool
  42.  
  43.   let encode ~mem ~find ~is_full state =
  44.     let { State. seq ; token } = state in
  45.     let next_seq = seq ^ token in
  46.     if mem next_seq then
  47.       Change.Found
  48.         { seq = next_seq }
  49.     else if is_full () then
  50.       Change.Overflow
  51.         { seq = token
  52.         ; code = find seq }
  53.     else
  54.       Change.Not_found
  55.         { seq = token
  56.         ; new_seq = next_seq
  57.         ; code = find seq }
  58.  
  59.   type env =
  60.     { mutable seq : string
  61.     ; dict        : Dict.}
  62.  
  63.   let make_env () =
  64.     { seq = "" ; dict = Dict.make () }
  65.  
  66.   let update env = function
  67.   | Change.Found { seq } ->
  68.     env.seq <- seq
  69.   | Change.Not_found { seq ; new_seq ; code } ->
  70.     env.seq <- seq ;
  71.     Dict.add env.dict new_seq
  72.   | Change.Overflow { seq ; code } ->
  73.     env.seq <- seq ;
  74.     Dict.reset env.dict
  75.  
  76.   let emit = function
  77.   | Change.Found     _ -> []
  78.   | Change.Not_found v -> [ v.code ]
  79.   | Change.Overflow  v -> [ v.code ; Dict.reset_code ]
  80.  
  81.   let make () =
  82.     let env = make_env () in
  83.     let as_state token = { State. seq = env.seq ; token = token } in
  84.     let encode = encode
  85.       ~mem:(Dict.mem env.dict)
  86.       ~find:(Dict.find env.dict)
  87.       ~is_full:(fun _ -> Dict.is_full env.dict)
  88.     in
  89.       fun token -> token
  90.         |> as_state
  91.         |> encode
  92.         |> chain (update env)
  93.         |> emit
  94.  
  95. end
  96.  
  97. (* ================================================================ *)
  98.  
  99. module Encoder_test = struct
  100.  
  101.   module Dict_stub = struct
  102.     type t = unit
  103.     let reset_code = 42
  104.     let make () = ()
  105.     let add d s = ()
  106.     let mem d s = false
  107.     let find d s = 42
  108.     let is_full d = false
  109.     let reset d = ()
  110.   end
  111.  
  112.   module E = Encoder (Dict_stub)
  113.  
  114.   let name = "encode"
  115.  
  116.   let _ =
  117.     "TEST : " ^ name |> print_endline;
  118.  
  119.     let encode = E.encode
  120.       ~mem:(fun s -> s = "A")
  121.       ~find:(fun _ -> 13)
  122.       ~is_full:(fun _ -> false)
  123.     in
  124.       ( match encode { seq = "" ; token = "A" } with
  125.       | E.Change.Found { seq } ->
  126.         assert (seq = "A")
  127.       | _ -> assert false );
  128.  
  129.       ( match encode { seq = "A" ; token = "A" } with
  130.       | E.Change.Not_found { seq ; new_seq ; code } ->
  131.         assert (seq = "A") ;
  132.         assert (new_seq = "AA") ;
  133.         assert (code = 13)
  134.       | _ -> assert false );
  135.  
  136.       ( match encode { seq = "A" ; token = "B" } with
  137.       | E.Change.Not_found { seq ; new_seq ; code } ->
  138.         assert (seq = "B") ;
  139.         assert (new_seq = "AB") ;
  140.         assert (code = 13)
  141.       | _ -> assert false );
  142.  
  143.     let encode = E.encode
  144.       ~mem:(fun s -> s = "A")
  145.       ~find:(fun _ -> 13)
  146.       ~is_full:(fun _ -> true)
  147.     in
  148.       ( match encode { seq = "" ; token = "A" } with
  149.       | E.Change.Found { seq } ->
  150.         assert (seq = "A")
  151.       | _ -> assert false );
  152.  
  153.       ( match encode { seq = "A" ; token = "A" } with
  154.       | E.Change.Overflow { seq ; code } ->
  155.         assert (seq = "A") ;
  156.         assert (code = 13)
  157.       | _ -> assert false );
  158.  
  159.       ( match encode { seq = "A" ; token = "B" } with
  160.       | E.Change.Overflow { seq ; code } ->
  161.         assert (seq = "B") ;
  162.         assert (code = 13)
  163.       | _ -> assert false );
  164.  
  165.     (* Cyrillic *)
  166.     let encode = E.encode
  167.       ~mem:(fun s -> s = "Ц")
  168.       ~find:(fun _ -> 13)
  169.       ~is_full:(fun _ -> false)
  170.     in
  171.       ( match encode { seq = "" ; token = "Ц" } with
  172.       | E.Change.Found { seq } ->
  173.         assert (seq = "Ц")
  174.       | _ -> assert false );
  175.  
  176.       ( match encode { seq = "Ц" ; token = "Ц" } with
  177.       | E.Change.Not_found { seq ; new_seq ; code } ->
  178.         assert (seq = "Ц") ;
  179.         assert (new_seq = "ЦЦ") ;
  180.         assert (code = 13)
  181.       | _ -> assert false );
  182.  
  183.       ( match encode { seq = "Ц" ; token = "Ж" } with
  184.       | E.Change.Not_found { seq ; new_seq ; code } ->
  185.         assert (seq = "Ж") ;
  186.         assert (new_seq = "ЦЖ") ;
  187.         assert (code = 13)
  188.       | _ -> assert false );
  189.  
  190.     (* Japanese 絶対 *)
  191.     let encode = E.encode
  192.       ~mem:(fun s -> s = "絶")
  193.       ~find:(fun _ -> 13)
  194.       ~is_full:(fun _ -> false)
  195.     in
  196.       ( match encode { seq = "" ; token = "絶" } with
  197.       | E.Change.Found { seq } ->
  198.         assert (seq = "絶")
  199.       | _ -> assert false );
  200.  
  201.       ( match encode { seq = "絶" ; token = "絶" } with
  202.       | E.Change.Not_found { seq ; new_seq ; code } ->
  203.         assert (seq = "絶") ;
  204.         assert (new_seq = "絶絶") ;
  205.         assert (code = 13)
  206.       | _ -> assert false );
  207.  
  208.       ( match encode { seq = "絶" ; token = "対" } with
  209.       | E.Change.Not_found { seq ; new_seq ; code } ->
  210.         assert (seq = "対") ;
  211.         assert (new_seq = "絶対") ;
  212.         assert (code = 13)
  213.       | _ -> assert false );
  214.  
  215.     "PASS : " ^ name |> print_endline
  216.  
  217. end
  218.  
  219. (* ================================================================ *)
  220.  
  221. module type Token_encoder = sig
  222.   val make : unit -> string -> int list
  223. end
  224.  
  225. module Encode (Enc : Token_encoder) = struct
  226.  
  227.   let string_to_list s =
  228.     let codes = ref [] in
  229.     let push c = codes := c :: !codes in
  230.     let push_all = List.iter push in
  231.     let encode = Enc.make () in
  232.     let as_token c = String.make 1 c in
  233.     let f c = c |> as_token |> encode |> push_all in
  234.     String.iter f s ;
  235.     f '#' ;
  236.     List.rev !codes
  237.  
  238. end
  239.  
  240. (* ================================================================ *)
  241.  
  242. module type Encode_conf = sig
  243.   val capacity : int
  244.   val alphabet : string
  245. end
  246.  
  247. module Encode_dict (Conf : Encode_conf) = struct
  248.  
  249.   let _ =
  250.     let cap = Conf.capacity in
  251.     let alpha_len = String.length Conf.alphabet in
  252.     assert (cap > 0) ;
  253.     assert (alpha_len <= cap) ;
  254.     let module CS = Set.Make (Char) in
  255.     let unique = Conf.alphabet |> String.to_seq |> CS.of_seq in
  256.     assert (alpha_len = CS.cardinal unique)
  257.  
  258.   type t = (stringint) Hashtbl.t
  259.  
  260.   let reset_code = Conf.capacity + 1
  261.  
  262.   let reset dict =
  263.     Hashtbl.clear dict ;
  264.     let map (i, c) = (String.make 1 c, i+1) in
  265.     Conf.alphabet
  266.     |> String.to_seqi
  267.     |> Seq.map map
  268.     |> Hashtbl.add_seq dict
  269.  
  270.   let make () =
  271.     let dict = Hashtbl.create Conf.capacity in
  272.     reset dict ;
  273.     dict
  274.  
  275.   let is_full dict =
  276.     Hashtbl.length dict = Conf.capacity
  277.  
  278.   exception Key_duplicate
  279.   exception Capacity_overflow
  280.  
  281.   let add dict key =
  282.     if Hashtbl.mem dict key then raise Key_duplicate ;
  283.     if is_full dict then raise Capacity_overflow ;
  284.     Hashtbl.add dict key (Hashtbl.length dict + 1)
  285.  
  286.   let mem = Hashtbl.mem
  287.  
  288.   exception Key_not_found
  289.  
  290.   let find dict key =
  291.     match Hashtbl.find_opt dict key with
  292.     | Some v -> v
  293.     | None   -> raise Key_not_found
  294.  
  295. end
  296.  
  297. (* ================================================================ *)
  298.  
  299. module Encode_test = struct
  300.  
  301.   let str xs =
  302.       "[" ^
  303.       (  xs
  304.       |> List.map string_of_int
  305.       |> String.concat "; " ) ^
  306.       "]"
  307.  
  308.   let _ =
  309.     let module Dict = Encode_dict (struct
  310.       let capacity = 42
  311.       let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  312.     end) in
  313.  
  314.     let module Encode = Encode (Encoder (Dict)) in
  315.  
  316.     let name = "string_to_list" in
  317.     "TEST : " ^ name |> print_endline ;
  318.  
  319.     let input = "TOBEORNOTTOBEORTOBEORNOT" in
  320.     let expected =
  321.       [ 20; 15; 2; 5; 15; 18; 14; 15
  322.       ; 20; 27; 29; 31; 36; 30; 32; 34 ]
  323.     in
  324.     let actual = Encode.string_to_list input in
  325.     if List.equal (=) actual expected then
  326.       "PASS : " ^ name |> print_endline
  327.     else begin
  328.       "FAIL : " ^ name |> print_endline ;
  329.       "    expected: " ^ str expected |> print_endline ;
  330.       "    actual:   " ^ str actual |> print_endline
  331.     end
  332.  
  333.   let _ =
  334.     let module Dict = Encode_dict (struct
  335.       let capacity = 26
  336.       let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  337.     end) in
  338.  
  339.     let module Encode = Encode (Encoder (Dict)) in
  340.  
  341.     let name = "string_to_list (with overflow)" in
  342.     "TEST : " ^ name |> print_endline ;
  343.  
  344.     let input = "TOBETO" in
  345.     let expected = [20; 27; 15; 27; 2; 27; 5; 27; 20; 27; 15; 27] in
  346.     let actual = Encode.string_to_list input in
  347.     if List.equal (=) actual expected then
  348.       "PASS : " ^ name |> print_endline
  349.     else begin
  350.       "FAIL : " ^ name |> print_endline ;
  351.       "    expected: " ^ str expected |> print_endline ;
  352.       "    actual:   " ^ str actual |> print_endline
  353.     end
  354.  
  355. end
  356.  
  357. (* ================================================================ *)
  358.  
  359. module Encode_demo = struct
  360.  
  361.   module Dict = Encode_dict (struct
  362.     let capacity = 42
  363.     let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  364.   end)
  365.  
  366.   module Encode = Encode (Encoder (Dict))
  367.  
  368.   let run input = input
  369.     |> Encode.string_to_list
  370.     |> List.iter (Printf.printf "%d ") ;
  371.     print_endline ""
  372.  
  373.   let _ =
  374.     run "TOTO" ;
  375.     run "TOBEORNOTTOBEORTOBEORNOT" ;
  376.     print_endline "20 15 2 5 15 18 14 15 20 27 29 31 36 30 32 34"
  377.  
  378. end
  379.  
  380. (* ================================================================ *)
  381.  
  382. module type Decoder_dict = sig
  383.   type t
  384.   val reset_code : int
  385.   val make       : unit -> t
  386.   val add        : t -> string -> unit
  387.   val find_opt   : t -> int -> string option
  388.   val reset      : t -> unit
  389.   val size       : t -> int
  390. end
  391.  
  392. module Decoder (Dict : Decoder_dict) = struct
  393.  
  394.   let append_first w s =
  395.     w ^ String.sub s 0 1
  396.  
  397.   module State = struct
  398.     type t =
  399.       { seq  : string
  400.       ; code : int }
  401.   end
  402.  
  403.   module Change = struct
  404.     type t =
  405.       | First of string
  406.       | Found of found
  407.       | Reset
  408.       | Not_found
  409.     and found =
  410.       { emit_seq : string
  411.       ; dict_seq : string }
  412.   end
  413.  
  414.   type find_opt = int -> string option
  415.   type size     = unit -> int
  416.  
  417.   let decode ~find_opt ~size state =
  418.     let { State. seq ; code } = state in
  419.     if code = Dict.reset_code then
  420.       Change.Reset
  421.     else if seq = "" then
  422.       match find_opt code with
  423.       | Some v -> Change.First v
  424.       | None   -> Change.Not_found
  425.     else
  426.       match find_opt code with
  427.       | Some v ->
  428.         Change.Found
  429.           { emit_seq = v
  430.           ; dict_seq = append_first seq v }
  431.       | None ->
  432.         if code = size () + 1 then
  433.           let v = append_first seq seq in
  434.           Change.Found
  435.             { emit_seq = v
  436.             ; dict_seq = append_first seq v }
  437.         else
  438.           Change.Not_found
  439.  
  440.   type env =
  441.     { mutable seq : string
  442.     ; dict        : Dict.}
  443.  
  444.   let make_env () =
  445.     { seq = "" ; dict = Dict.make () }
  446.  
  447.   exception Invalid_input
  448.  
  449.   let update env = function
  450.   | Change.First seq ->
  451.     env.seq <- seq ;
  452.   | Change.Found { emit_seq ; dict_seq } ->
  453.     Dict.add env.dict dict_seq ;
  454.     env.seq <- emit_seq
  455.   | Change.Reset ->
  456.     Dict.reset env.dict ;
  457.   | Change.Not_found ->
  458.     raise Invalid_input
  459.  
  460.   let emit = function
  461.   | Change.First seq -> [ seq ]
  462.   | Change.Found v   -> [ v.emit_seq ]
  463.   | Change.Reset     -> []
  464.   | Change.Not_found -> raise Invalid_input
  465.  
  466.   let make () =
  467.     let env = make_env () in
  468.     let as_state code = { State. seq = env.seq ; code = code } in
  469.     let decode = decode
  470.       ~find_opt:(Dict.find_opt env.dict)
  471.       ~size:(fun _ -> Dict.size env.dict)
  472.     in
  473.       fun code -> code
  474.         |> as_state
  475.         |> decode
  476.         |> chain (update env)
  477.         |> emit
  478.  
  479. end
  480.  
  481. (* ================================================================ *)
  482.  
  483. module Decoder_test = struct
  484.  
  485.   module Dict_stub = struct
  486.     type t = unit
  487.     let reset_code = 42
  488.     let make () = ()
  489.     let add d s = ()
  490.     let find_opt d = function
  491.       | 1 -> Some "A"
  492.       | 2 -> Some "B"
  493.       | 3 -> Some "AB"
  494.       | 4 -> Some "BB"
  495.       | _ -> None
  496.     let size d = 4
  497.     let reset d = ()
  498.   end
  499.  
  500.   module D = Decoder (Dict_stub)
  501.  
  502.   let name = "decode"
  503.  
  504.   let _ =
  505.     "TEST : " ^ name |> print_endline;
  506.  
  507.     let dict = Dict_stub.make () in
  508.     let decode = D.decode
  509.       ~find_opt:(Dict_stub.find_opt dict)
  510.       ~size:(fun _ -> Dict_stub.size dict)
  511.     in
  512.       ( match decode { seq = "" ; code = 1 } with
  513.       | D.Change.First seq ->
  514.         assert (seq = "A")
  515.       | _ -> assert false );
  516.  
  517.       ( match decode { seq = "A" ; code = 1 } with
  518.       | D.Change.Found { emit_seq ; dict_seq } ->
  519.         assert (emit_seq = "A") ;
  520.         assert (dict_seq = "AA")
  521.       | _ -> assert false );
  522.  
  523.       ( match decode { seq = "A" ; code = 2 } with
  524.       | D.Change.Found { emit_seq ; dict_seq } ->
  525.         assert (emit_seq = "B") ;
  526.         assert (dict_seq = "AB")
  527.       | _ -> assert false );
  528.  
  529.       ( match decode { seq = "B" ; code = 1 } with
  530.       | D.Change.Found { emit_seq ; dict_seq } ->
  531.         assert (emit_seq = "A") ;
  532.         assert (dict_seq = "BA")
  533.       | _ -> assert false );
  534.  
  535.       ( match decode { seq = "B" ; code = 2 } with
  536.       | D.Change.Found { emit_seq ; dict_seq } ->
  537.         assert (emit_seq = "B") ;
  538.         assert (dict_seq = "BB")
  539.       | _ -> assert false );
  540.  
  541.       ( match decode { seq = "AB" ; code = 3 } with
  542.       | D.Change.Found { emit_seq ; dict_seq } ->
  543.         assert (emit_seq = "AB") ;
  544.         assert (dict_seq = "ABA")
  545.       | _ -> assert false );
  546.  
  547.       ( match decode { seq = "A" ; code = 4 } with
  548.       | D.Change.Found { emit_seq ; dict_seq } ->
  549.         assert (emit_seq = "BB") ;
  550.         assert (dict_seq = "AB")
  551.       | _ -> assert false );
  552.  
  553.       ( match decode { seq = "B" ; code = 4 } with
  554.       | D.Change.Found { emit_seq ; dict_seq } ->
  555.         assert (emit_seq = "BB") ;
  556.         assert (dict_seq = "BB")
  557.       | _ -> assert false );
  558.  
  559.       ( match decode { seq = "" ; code = 42 } with
  560.       | D.Change.Reset -> ()
  561.       | _ -> assert false );
  562.  
  563.       ( match decode { seq = "A" ; code = 42 } with
  564.       | D.Change.Reset -> ()
  565.       | _ -> assert false );
  566.  
  567.       ( match decode { seq = "B" ; code = 42 } with
  568.       | D.Change.Reset -> ()
  569.       | _ -> assert false );
  570.  
  571.       ( match decode { seq = "AB" ; code = 42 } with
  572.       | D.Change.Reset -> ()
  573.       | _ -> assert false );
  574.  
  575.       ( match decode { seq = "BB" ; code = 42 } with
  576.       | D.Change.Reset -> ()
  577.       | _ -> assert false );
  578.  
  579.     "PASS : " ^ name |> print_endline
  580.  
  581. end
  582.  
  583. (* ================================================================ *)
  584.  
  585. module type Code_decoder = sig
  586.   val make : unit -> int -> string list
  587. end
  588.  
  589. module Decode (Dec : Code_decoder) = struct
  590.  
  591.   let list_to_string xs =
  592.     let tokens = ref [] in
  593.     let push t = tokens := t :: !tokens in
  594.     let push_all = List.iter push in
  595.     let decode = Dec.make () in
  596.     let f c = c |> decode |> push_all in
  597.     List.iter f xs ;
  598.     List.rev !tokens |> String.concat ""
  599.  
  600. end
  601.  
  602. (* ================================================================ *)
  603.  
  604. module type Decode_conf = sig
  605.   val capacity : int
  606.   val alphabet : string
  607. end
  608.  
  609. module Decode_dict (Conf : Decode_conf) = struct
  610.  
  611.   let _ =
  612.     let cap = Conf.capacity in
  613.     let alpha_len = String.length Conf.alphabet in
  614.     assert (cap > 0) ;
  615.     assert (alpha_len <= cap) ;
  616.     let module CS = Set.Make (Char) in
  617.     let unique = Conf.alphabet |> String.to_seq |> CS.of_seq in
  618.     assert (alpha_len = CS.cardinal unique)
  619.  
  620.   type t = (intstring) Hashtbl.t
  621.  
  622.   let reset_code = Conf.capacity + 1
  623.  
  624.   let reset dict =
  625.     Hashtbl.clear dict ;
  626.     let map (i, c) = (i+1String.make 1 c) in
  627.     Conf.alphabet
  628.     |> String.to_seqi
  629.     |> Seq.map map
  630.     |> Hashtbl.add_seq dict
  631.  
  632.   let make () =
  633.     let dict = Hashtbl.create Conf.capacity in
  634.     reset dict ;
  635.     dict
  636.  
  637.   let size = Hashtbl.length
  638.  
  639.   exception Capacity_overflow
  640.  
  641.   let add dict key =
  642.     (* if size dict = Conf.capacity then raise Capacity_overflow ; *)
  643.     Hashtbl.add dict (Hashtbl.length dict + 1) key
  644.  
  645.   let find_opt = Hashtbl.find_opt
  646.  
  647. end
  648.  
  649. (* ================================================================ *)
  650.  
  651. module Decode_test = struct
  652.  
  653.   let _ =
  654.     let module Dict = Decode_dict (struct
  655.       let capacity = 42
  656.       let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  657.     end) in
  658.  
  659.     let module Decode = Decode (Decoder (Dict)) in
  660.  
  661.     let name = "list_to_string" in
  662.     "TEST : " ^ name |> print_endline ;
  663.  
  664.     let input =
  665.       [ 20; 15; 2; 5; 15; 18; 14; 15
  666.       ; 20; 27; 29; 31; 36; 30; 32; 34 ]
  667.     in
  668.     let expected = "TOBEORNOTTOBEORTOBEORNOT" in
  669.     let actual = Decode.list_to_string input in
  670.     if actual = expected then
  671.       "PASS : " ^ name |> print_endline
  672.     else begin
  673.       "FAIL : " ^ name |> print_endline ;
  674.       "    expected: " ^ expected |> print_endline ;
  675.       "    actual:   " ^ actual |> print_endline
  676.     end
  677.  
  678.   let _ =
  679.     let module Dict = Decode_dict (struct
  680.       let capacity = 26
  681.       let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  682.     end) in
  683.  
  684.     let module Decode = Decode (Decoder (Dict)) in
  685.  
  686.     let name = "string_to_list (with overflow)" in
  687.     "TEST : " ^ name |> print_endline ;
  688.  
  689.     let input = [20; 27; 15; 27; 2; 27; 5; 27; 20; 27; 15; 27] in
  690.     let expected = "TOBETO" in
  691.     let actual = Decode.list_to_string input in
  692.     if actual = expected then
  693.       "PASS : " ^ name |> print_endline
  694.     else begin
  695.       "FAIL : " ^ name |> print_endline ;
  696.       "    expected: " ^ expected |> print_endline ;
  697.       "    actual:   " ^ actual |> print_endline
  698.     end
  699.  
  700. end
  701.  
  702. (* ================================================================ *)
  703.  
  704. module Decode_demo = struct
  705.  
  706.   module Dict = Decode_dict (struct
  707.     let capacity = 42
  708.     let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  709.   end)
  710.  
  711.   module Decode = Decode (Decoder (Dict))
  712.  
  713.   let run input = input
  714.     |> Decode.list_to_string
  715.     |> print_endline
  716.  
  717.   let _ =
  718.     run [ 20; 15; 27 ] ;
  719.     run [ 20; 15; 2; 5; 15; 18; 14; 15; 20; 27; 29; 31; 36; 30; 32; 34 ] ;
  720.     print_endline "TOBEORNOTTOBEORTOBEORNOT"
  721.  
  722. end
  723.  
  724. (* ================================================================ *)
  725.  
  726. module type Full_conf = sig
  727.   val capacity : int
  728.   val alphabet : string
  729. end
  730.  
  731. module Full_coder (Conf : Full_conf) = struct
  732.  
  733.   module Encode = Encode (Encoder (Encode_dict (Conf)))
  734.   module Decode = Decode (Decoder (Decode_dict (Conf)))
  735.  
  736.   type decoded = string
  737.   type encoded = int list
  738.  
  739.   let encode = Encode.string_to_list
  740.   let decode = Decode.list_to_string
  741.  
  742. end
  743.  
  744. (* ================================================================ *)
  745.  
  746. module type Coder = sig
  747.   type decoded = string
  748.   type encoded
  749.  
  750.   val encode : decoded -> encoded
  751.   val decode : encoded -> decoded
  752. end
  753.  
  754. module Full_test (: Coder) = struct
  755.  
  756.   let test input =
  757.     let result = input |> C.encode |> C.decode in
  758.     assert (result = input)
  759.  
  760.   let name = "full"
  761.  
  762.   let _ =
  763.     "TEST : " ^ name |> print_endline ;
  764.     test "TOTO" ;
  765.     test "TOBEOR" ;
  766.     test "TOBEORTOBEER" ;
  767.     test "TOBEORNOTTOBE" ;
  768.     test "TWOBEERORNOTTWOBEER" ;
  769.     test "TOBEORNOTTOBEORTOBEORNOT" ;
  770.     "PASS : " ^ name |> print_endline
  771.  
  772. end
  773.  
  774. module Test = struct
  775.  
  776.   module Conf = struct
  777.     let capacity = 42
  778.     let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  779.   end
  780.  
  781.   module Coder = Full_coder (Conf)
  782.  
  783.   module T = Full_test (Coder)
  784.  
  785. end

Editor

You can edit this paste and save as new:


File Description
  • OCaml LZW
  • Paste Code
  • 24 Jul-2022
  • 19.71 Kb
You can Share it: