Node.Thunk is a library for PureScript which helps to interface
with asynchronous Node.js code:
This simple example shows how to use Node.Thunk to wrap a part of Node.js's
fs module:
import Node.Thunk
foreign import fs "var fs = require('fs');" :: {
readFile :: ThunkFn1 String String
}
readFile = runThunkFn1 fs.readFile
The type ThunkFn1 a b means that a function takes a single argument of type
a and produces a result of type b. To convert ThunkFn1 a b into a
PureScript function a -> Thunk b we need to apply runThunkFn1 function.
Similarly to ThunkFn1 there exists ThunkFn2, ThunkFn3 for each arity up to
5.
This simple examples shows how to combine computations with thunks:
readFileAndWait = do
contents <- readFile "./README.md"
delay 1000
return contents
delay is a computation which results into Unit value (nothing) after some
milliseconds elapsed.
To execute computation you should use runThunk function:
main = runThunk readFileAndWait handle
where
handle (Left err) = -- handle error
handle (Right result) = -- handle result
runThunk function thunk as first argument and handler as second argument.
Handler is supplied with either an error or a result.
There's a function liftEff which can lift Eff action into Thunk:
readFileAndPrintContents = do
contents <- readFile "./README.md"
liftEff (print contents)