ligo/rope/rope.ml
2019-05-12 20:57:30 +00:00

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