preserves/implementations/dhall
Emery Hemingway 2ff489d975 Initial Dhall functions
Add functions for representing the JSON subset of Preserves in the
Dhall configuration language.

https://dhall-lang.org/
2021-10-22 19:01:32 +02:00
..
Prelude.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
README.md Initial Dhall functions 2021-10-22 19:01:32 +02:00
Type.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
boolean.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
dictionary.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
dictionaryOf.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
double.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
embedded.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
fromJSON.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
function.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
integer.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
package.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
record.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
render.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
sequence.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
sequenceOf.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
string.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00
symbol.dhall Initial Dhall functions 2021-10-22 19:01:32 +02:00

README.md

Dhall

Not a true implementation of Preserves, but functions for translating Dhall values to Preserves and rendering them.

For example, to generate configuration for a Syndicate server listener:

let Prelude = ./Prelude.dhall

let Preserves = ./package.dhall

let Tcp/Type = { address : Text, port : Natural }

let RelayListener/Type = { transport : Tcp/Type }

let RequireService/Type = { relayListener : RelayListener/Type }

let Tcp/toPreserves =
      λ(tcp : Tcp/Type) →
        Preserves.record
          (Preserves.symbol "tcp")
          [ Preserves.string tcp.address
          , Preserves.integer (Prelude.Natural.toInteger tcp.port)
          ]

let RelayListener/toPreserves =
      λ(relayListener : RelayListener/Type) →
        Preserves.record
          (Preserves.symbol "relay-listener")
          [ Tcp.toPreserves relayListener.transport ]

let RequireService/toPreserves =
      λ(requireService : RequireService/Type) →
        Preserves.record
          (Preserves.symbol "require-service")
          [ RelayListener.toPreserves requireService.relayListener ]

let example = { relayListener.transport = { address = "127.0.0.1", port = 1 } }

let rendering = Preserves.render (RequireService.toPreserves example)

let check =
        assert
      : rendering ≡ "<require-service <relay-listener <tcp \"127.0.0.1\" 1>>>"

in  rendering