Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mstksg/dhall-text-shell
dhall text but provide shell commands as function arguments
https://github.com/mstksg/dhall-text-shell
Last synced: about 2 months ago
JSON representation
dhall text but provide shell commands as function arguments
- Host: GitHub
- URL: https://github.com/mstksg/dhall-text-shell
- Owner: mstksg
- License: bsd-3-clause
- Created: 2022-04-21T05:51:03.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-05-01T05:56:56.000Z (over 2 years ago)
- Last Synced: 2024-05-02T00:12:11.183Z (8 months ago)
- Language: Haskell
- Size: 10.7 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
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` ?```dhall
-- 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"hello
,world
$ 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:
```dhall
-- 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.