I can't believe this. Just 2 or so weeks ago I set about writing exactly something like this in Haskell [1]. It's by no means complete or even working at this point, but basically what I had in mind was something like:
Every tool emits or consumes "typed" JSON (i.e. JSON data with an additional JSON schema). Why typed? Because then the meaning of things like mdate = yesterday can be inferred from the type of mdate and mean different things depending on whether mdate is a string or a date. In the case of a date, the expression mdate = yesterday can automatically be rewritten to mdate >= 201208110000 && mdate < 201208120000 etc. In the case of a string we do string comparison. In the case of a bool we emit an error if the compared-to value isn't either true or false, etc.
Basically, I wanted to build a couple of standard tools inspired by the FP world, like filter, sort, map, fold (reduce) and have an universal tool for outputting formatted data in whatever form is desired - be it JSON, csv files, text files or custom formats. Every tool would support an -f parameter, which means that its output is automatically piped through the format tool, so that something like
yls -fls
is functionally equivalent to
yls | yformat -ls
which would output the JSON data from yls in the traditional ls way on a unix system.
yls | yformat -csv
would output csv data. Some more examples:
yls | yfold '+ size' 0
prints out the combined size of all files in the current directory.
yls | ymap 'name = name + .jpg' | ymv
would append .jpg to all files in the current directory.
ycontacts | yfilter -fcsv 'name = *John*'
would print out all Google contacts containing John in their name as a csv file.
yps | yfilter 'name = java*' | yeval 'kill name'
would kill all processes whose names start with 'java'.
The cool thing about this is that this approach conserves one of the main selling points of FP: composability. I.e. you can throw something like yfold '+ size' 0 in a shell script and then write:
yls | size.sh
This way people would be able to build an ever growing toolbelt of abstracted functionality specifically tailored to their way of doing things, without losing composability.
Basically, I wanted to build a couple of standard tools inspired by the FP world, like filter, sort, map, fold (reduce) and have an universal tool for outputting formatted data in whatever form is desired - be it JSON, csv files, text files or custom formats. Every tool would support an -f parameter, which means that its output is automatically piped through the format tool, so that something like
is functionally equivalent to which would output the JSON data from yls in the traditional ls way on a unix system. would output csv data. Some more examples: prints out the combined size of all files in the current directory. would append .jpg to all files in the current directory. would print out all Google contacts containing John in their name as a csv file. would kill all processes whose names start with 'java'.The cool thing about this is that this approach conserves one of the main selling points of FP: composability. I.e. you can throw something like yfold '+ size' 0 in a shell script and then write:
This way people would be able to build an ever growing toolbelt of abstracted functionality specifically tailored to their way of doing things, without losing composability.[1] https://github.com/pkamenarsky/ytools