@hackage dhall-text-shell0.1.0.0
Render dhall text with shell commands as function arguments
Categories
License
MIT
Maintainer
Justin Le <justin@jle.im>
Links
Versions
Installation
Tested Compilers
Dependencies (7)
- base >=4.11.0.0 && <5
- containers
- dhall
- filepath
- optparse-applicative
- process Show all…
Dependents (0)
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.