40 lines
1.0 KiB
OCaml
40 lines
1.0 KiB
OCaml
module RopeImplementation = Rope_implementation
|
|
|
|
type impl = RopeImplementation.t
|
|
|
|
type 'a t =
|
|
S : string -> (((impl -> 'a) -> 'b) -> (impl -> 'a) -> 'b) t
|
|
| Other : 'a -> 'a t
|
|
|
|
let _S =
|
|
fun constant ->
|
|
fun f ->
|
|
fun new_cont ->
|
|
f (fun (acc : impl) -> new_cont RopeImplementation.(cat acc (of_string constant)))
|
|
|
|
let z = Other _S
|
|
let _d =
|
|
fun f ->
|
|
fun new_cont ->
|
|
f (fun (acc : impl) (i : int) -> new_cont RopeImplementation.(cat acc (of_string (string_of_int i))))
|
|
let d = Other _d
|
|
|
|
let _s =
|
|
fun f ->
|
|
fun new_cont ->
|
|
f (fun (acc : impl) (s : string) -> new_cont RopeImplementation.(cat acc (of_string s)))
|
|
let s = Other _s
|
|
|
|
let start cont = cont RopeImplementation.(of_string "")
|
|
let finish (acc : impl) = acc
|
|
|
|
let (~%) : type a b . (((impl -> a) -> a) -> b) t -> b =
|
|
function
|
|
| S str -> _S str start
|
|
| Other f -> f start
|
|
let (%) : type a b . a -> (a -> b) t -> b = fun fmt1 fmt2 -> match fmt2 with
|
|
| S str -> _S str fmt1
|
|
| Other f2 -> f2 fmt1
|
|
let (#%) fmt arg =
|
|
(fmt finish) arg
|