Skip to content

mstksg/dhall-text-shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dhall-text-shell

dhall text and dhall to-directory-tree require the expression (or file leaves) to be Text. But what if it was able to also render expressions of type (Text -> Text) -> Text (or (Text -> Text) -> directory tree), 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.

This also supports dhall to-directory-tree as well with a --directory-tree flag, and in a similar fashion it takes a function (Text -> Text) -> (directory tree record), to be supplied the shell function.

About

dhall text but provide shell commands as function arguments

Resources

License

Stars

Watchers

Forks

Packages

No packages published