### Structured keys

`val empty : t`

`empty`

is the empty key. It refers to the top-level dictionary.

`val v : string -> t`

`v s`

is the string `s`

as a key. A key `"/foo/bar"`

is decomposed into the segments `"foo"`

and `"bar"`

. The initial `"/"`

is always ignored so `"foo/bar"`

and `"/foo/bar"`

are equal.

`add t s`

is the concatenated key `t/s`

. Raise `Invalid_argument`

if `s`

contains `"/"`

.

`val segments : t -> string list`

`segments t`

is `t`

's list of segments.

`val basename : t -> string`

`basename t`

is the last segment of `t`

. `basename empty`

is the empty string `""`

.

`parent t`

is the key without the last segment. `parent empty`

is `empty`

.

For any `t`

, the invariant have `parent t / basename t`

is `t`

.

`val to_string : t -> string`

`to_string t`

is the string representation of `t`

. `"/"`

is used as separator between segements and it always starts with `"/"`

.