Last active
March 12, 2020 12:30
-
-
Save kritzcreek/12ed98fefe3e541f2b434488b47185a5 to your computer and use it in GitHub Desktop.
Purescript - Read a file from disc with the browser API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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