I can't believe this. Just 2 or so weeks ago I set about writing exactly something like this in Haskell . 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
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.