Farfadet, a printf-like for Faraday library
To use this library, you can pin it with
opam pin add faraday https://github.com/inhabitedtyped/faraday.git opam pin add farfadet https://github.com/oklm-wsh/Farfadet.git
Firstly, you need to understand what Faraday is. Then, you can serialize something like this data:
type t = [ `Bool of bool | `Float of float | `Null | `String of string | `A of t list | `O of (string * t) list ]
You could write an encoder function with Faraday, like this:
let rec write_json enc = function | `Bool true -> Faraday.write_string enc "true" | `Bool false -> Faraday.write_string enc "false" ... | `A lst -> Faraday.write_char enc '['; let rec aux = function |  -> () | [ x ] -> write_json x | x :: r -> write_json x; Faraday.write_char ','; aux r in aux lst; Faraday.write_char enc ']'
And it's boring... Yes.
Farfadet can help you to write a serializer in a type-safe way. This is an example:
let comma = let open Farfadet in (fun e () -> string e ","), () let rec value : t Farfadet.t = fun e x -> let open Farfadet in let arr = list ~sep:comma value in match x with | `Bool true -> string e "true" | `Bool false -> string e "false" ... | `A lst -> eval e [ char $ '['; !!arr; char $ ']'] lst
Much better. And it's like a
printf function in OCaml with a little overhead to facilitate the serialization of any data with a
Faraday backend. And you can do more.
Another example is to use a
memcpy implementation instead a
memmove implementation (provided by the standard library).
In fact, you can create your blitter and use it inside
let memcpy s soff d doff len = for i = 0 to len - 1 do Bigarray.Array1.set dst (doff + i) (String.get s (soff + i)) done let string' : string Farfadet.t = fun e -> eval e [ !!(whole @@ blitter String.length memcpy) ]
You can see the documentation to understand this snippet. A good example is provided in the test to serialize a
Faraday (dev version)
OCaml (>= 4.03.0)
A MirageOS hackathon
It's a Proof of Concept and you can improve the library like you want!