package sexp_decode
Install
Dune Dependency
Authors
Maintainers
Sources
md5=950b49a492f8d75c48141eae2f751b85
sha512=aec341da68e37fdda831db0525befcb45f6bf9a53430acc8372fc8151856e46c6eb5e8e6817a525b522e89adebd99dc7f8c67c6a5aa66871f9c409a8d16c2651
Description
A library of monadic combinators that help translating S-expressions (as provided by the Csexp library) into structured data
Published: 02 Mar 2022
README
Sexp_decode
Sexp_decode
is a library of monadic combinators for decoding S-expressions (as defined in the Csexp library) into structured data.
Example
The purpose of the library is to help the translation of S-expressions into structured data.
For example, you may want to transform an address book encoded as an S-expression into structured data, that is easier to process.
Let's assume your address book looks like the following:
open Sexp_decode
let address_book : sexp =
List
[
List
[
Atom "entry";
List [ Atom "name"; Atom "John Doe" ];
List [ Atom "country"; Atom "New Zealand" ];
];
List
[
Atom "entry";
List [ Atom "name"; Atom "Mary Poppins" ];
List [ Atom "email"; Atom "umbrella@imaginary-domain.uk" ];
];
List
[
Atom "entry";
List [ Atom "name"; Atom "Groot" ];
List [ Atom "country"; Atom "Groot" ];
];
]
A representation as an OCaml value that is probably easier to work with, is by using the following entry
type:
type entry =
{ name : string; country : string option; email : string option }
type address_book = entry list
It is easy to define decoders that produce values of types entry
and address_book
:
let entry_decoder : entry decoder =
field "entry"
@@ let* name = field "name" atom in
let* country = maybe @@ field "country" atom in
let+ email = maybe @@ field "email" atom in
{ name; country; email }
let address_book_decoder : address_book decoder = list entry_decoder
Then, you can execute the run
function, that has type 'a decoder -> sexp -> 'a option
. It produces the following result on our address_book
example:
let result = run address_book_decoder address_book
(* result =
Some
[{name = "John Doe"; country = Some "New Zealand"; email = None};
{name = "Mary Poppins"; country = None;
email = Some "umbrella@imaginary-domain.uk"};
{name = "Groot"; country = Some "Groot"; email = None}]
*)
In addition to the field
, maybe
, atom
and list
decoders, the Sexp_decode
library provides combinators to build compound decoders from basic ones, and compose them together. In particular, decoders for variants and records are provided.
For example, with the [fields] combinator, you could define [entry_decoder] as follows:
{[ let entry_decoder_alt : entry decoder = field "entry" @@ fields ~default:{ name = ""; country = None; email = None } [ ("name", atom >>| fun name entry -> { entry with name }); ( "country", atom >>| fun country entry -> { entry with country = Some country }); ("email", atom >>| fun email entry -> { entry with email = Some email }); ] ]}
With this alternative decoder for entries, the fields ["name"] ["country"] and ["email"] might occur in any order, and any number of times.
How to install the library
Sexp_decode
is available on opam
and can be installed with the following command:
opam install sexp_decode
Alternatively, you can install the development version as follows:
git clone https://gitlab.inria.fr/bmontagu/sexp_decode.git
cd sexp_decode
opam pin add .
Author: Benoît Montagu benoit.montagu@inria.fr
Copyright Inria 2022
Dependencies (4)
-
ocaml
>= "4.08"
-
ppx_inline_test
>= "v0.14.1"
-
csexp
>= "1.5.1"
-
dune
>= "2.9"
Dev Dependencies (1)
-
odoc
with-doc
Used by
None
Conflicts
None