Skip to content

Instantly share code, notes, and snippets.

@kritzcreek
Last active March 12, 2020 12:30
Show Gist options
  • Save kritzcreek/12ed98fefe3e541f2b434488b47185a5 to your computer and use it in GitHub Desktop.
Save kritzcreek/12ed98fefe3e541f2b434488b47185a5 to your computer and use it in GitHub Desktop.
Purescript - Read a file from disc with the browser API
import Control.Monad.Aff (Aff, Canceler(..), makeAff)
import Control.Monad.Eff.Class (liftEff)
import Control.Monad.Eff.Exception (error)
import DOM (DOM)
import DOM.Event.EventTarget (addEventListener, eventListener, removeEventListener)
import DOM.File.FileReader as FR
import DOM.File.Types (Blob, fileReaderToEventTarget)
import DOM.HTML.Event.EventTypes as Events
import Data.Foreign (readString)
-- | Reads the contents of a DOM API `File` from disk, with the assumption that
-- | the contents is plain text.
readAsText ∷ ∀ e. Blob → Aff String
readAsText blob = makeAff \cb → do
reader ← liftEff FR.fileReader
let
et = fileReaderToEventTarget reader
listener = eventListener \_ → do
removeEventListener Events.load listener false et
r ← runExcept ∘ readString <$> FR.result reader
cb $ lmap (const (error "A problem occurred while reading a file as text")) r
addEventListener Events.load listener false et
FR.readAsText blob reader
pure (Canceler \_ → liftEff (removeEventListener Events.load listener false et))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment