dhall-text-shell: Render dhall text with shell commands as function arguments

[ compiler, library, mit, program ] [ Propose Tags ]

`dhall-text-shell` requires the expression to be Text. But what if it was able to also render expressions of type `(Text -> Text) -> Text`, and be given a shell argument as the `Text -> Text` ?

This is essentially a very minimal FFI for dhall, since it doesn't require extending anything in the language. It just requires you to parameterize your program on that ffi function.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.2.0.0
Change log CHANGELOG.md
Dependencies base (>=4.11.0.0 && <5), containers, dhall, dhall-text-shell, filepath, optparse-applicative, process, text [details]
License MIT
Copyright 2021 Justin Le
Author Justin Le
Maintainer Justin Le <justin@jle.im>
Category Compiler
Home page https://github.com/mstksg/dhall-text-shell
Bug tracker https://github.com/mstksg/dhall-text-shell/issues
Source repo head: git clone https://github.com/mstksg/dhall-text-shell.git
Uploaded by jle at 2022-04-21T06:12:50Z
Distributions
Executables dhall-text-shell
Downloads 126 total (8 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-04-21 [all 1 reports]

Readme for dhall-text-shell-0.1.0.0

[back to package description]

dhall-text-shell

dhall-text-shell requires the expression to be Text. But what if it was able to also render expressions of type (Text -> Text) -> Text, and be given a shell argument as the Text -> Text ?

-- testfile.dhall
let text = https://raw.githubusercontent.com/dhall-lang/dhall-lang/v21.1.0/Prelude/Text/package.dhall
in  \(f : Text -> Text) -> text.concatMapSep "," Text f [ "hello", "world" ]

Would give:

$ dhall-text-shell --file testfile.dhall --argCmd cat
hello,world
$ dhall-text-shell --file testfile.dhall --argCmd "tr '[:lower:]' '[:upper:]'"
HELLO,WORLD
$ dhall-text-shell --file testfile.dhall --argCmd "pandoc -f markdown -t html"
<p>hello</p>
,<p>world</p>
$ dhall-text-shell --file testfile.dhall --argCmd "md5sum -z"
5d41402abc4b2a76b9719d911017c592  -,7d793037a0760186574b0282f2f435e7  -

Error messages:

$ dhall-text-shell --file testfile.dhall
Error: Expression doesn't match annotation

- Text
+ .. -> .. (a function type)
$ dhall-text-shell --file testfile.dhall --argCmd cat --argCmd cat
Error: Expression doesn't match annotation

- .. -> ..  (a function type)
+ Text

Supports multiple arguments as well:

-- testfile2.dhall
let text = https://raw.githubusercontent.com/dhall-lang/dhall-lang/v21.1.0/Prelude/Text/package.dhall
in  \(f : Text -> Text) -> \(g : Text -> Text) -> text.concatMapSep "," Text f [ "hello", g "world" ]
$ dhall-text-shell --file testfile2.dhall --argCmd cat --argCmd "tr '[:lower:]' '[:upper:]'"
hello,WORLD

This is essentially a very minimal "FFI" for dhall, since it doesn't require extending anything in the language. It just requires you to parameterize your program on that ffi function.

Note that for this to work meaningfully, your shell command must be "pure": it must return the same stdout for any stdin, and shouldn't observably affect the world every time it is run.