Operations can now:
1) return their progress directly.
2) throw an error.
3) (ADDED) return a promise:
+ that resolves to their progress.
+ that rejects an error message (like throwing but asynchronous).
For an example see the new operation "Wait" (Flow Control)
Added a flow control operation "Wait", which waits for the number of
milliseconds passed in as its argument. It is a fairly useless operation
but it does demonstrate how asynchronous operations now work.
A recipe like:
```
Fork
Wait (1000ms)
```
will only wait for 1000ms (each wait runs at the same time as each
other).
I have not looked into performance implications yet, also this code is
probably more complicated than it needs to be (would love help on this).
Before, the tar operation would write the incorrect number of bytes to
indicate the end of the tar file. It should have been 2 blocks of 512
ascii zeros, but it would write 529 zeros instead.
The new implementation of `writeEndBlocks` is nicer and we can reuse
code with the `addEmptyBlock` function.
+ Added skeleton "Tar" operation with no functionality
+ Added intial functionality of "Untar"
+ Added a function in `Utils` `HTMLFormat` to generalize HTML generation
of files and folders (could later be used in Unzip).
I had a brief search for a small library for tar and untar operations,
however they were mostly for node (if anyone finds one we can drop in
that would be appreciated) or unmaintained. Luckily the tar spec is
relatively easy to understand just from Wikipedia.
Added "To Morse Code" and "From More Code" functions under the category
"Encryption / Encoding".
"To Morse Code" accepts 3 arguments:
1. Format options: e.g. ./- or Dot/Dash
2. Letter delimiter e.g. <space> or <newline>
3. Word delimiter e.g. <newline>
"From Morse Code" accepts 2 arguments:
1. Letter delimiter
2. Word delimiter