task

A library for performing asynchronous effects.


License
BSD-3-Clause
Install
psc-package install task

Documentation

This is a library for performing asynchronous effects, heavily inspired by Elm's Task. In terms of functionality, it is a superset of the Elm implementation, with the following additions:

  • Tasks can be evaluated in parallel
  • Users can create their own tasks (this is technically possible in Elm via a hack)
  • An Apply instance*
  • An Alt instance (both non-parallel* and parallel)
  • A Monoid instance*

Example

Here is a contrived example where we use js-timers and node-fs to make wait and readFile tasks, then use them together to make a program that waits 1 second then logs itself to the console.

module Main where

import Prelude
import Data.Either (Either(..))
import Effect (Effect)
import Effect.Class.Console (log)
import Effect.Exception (Error)
import Effect.Timer (setTimeout, clearTimeout)
import Node.Buffer (toString)
import Node.Encoding (Encoding(..))
import Node.FS.Async as Fs
import Task (Task, makeTask)
import Task as Task

main :: Effect Unit
main =
  Task.run do
    wait 1000
    log =<< readFile "src/Main.purs"

wait ::  x. Int -> Task x Unit
wait ms =
  makeTask \aC _ -> do
    id <- setTimeout ms $ aC unit
    pure $ clearTimeout id

readFile :: String -> Task Error String
readFile path =
  makeTask \aC xC -> do
    Fs.readFile path case _ of
      Right buffer -> aC =<< toString UTF8 buffer
      Left error -> xC error
    -- There is no canceler for this task
    pure $ pure unit

* something similar can be done in Elm, but it would be more clunky and it isn't provided out of the box