Uploaded by
Published on

CI Pursuit

Primitive parsers for parsing DataViews on Javascript ArrayBuffers with the package purescript-parsing.

With this package, the input stream support of purescript-parsing roughly matches the built-in stream support of Megaparsec:

Stream type purescript-parsing Megaparsec
UTF-16 strings String Text
Listy strings Token String
Binary blobs DataView ByteString

Usage examples

Parse values out of a dataview :: Data.ArrayBuffer.Types.DataView. All DataView parsing must be done in an Effect context. The result will be Either a parse error or the parsed value.

Parse two numbers

Parse two big-endian IEEE 754 double-precision floats.

import Text.Parsing.Parser (runParserT)
import Text.Parsing.Parser.DataView (anyFloat64be)

  result <- runParserT dataview $ do
    float1 <- anyFloat64be
    float2 <- anyFloat64be
    pure $ Tuple float1 float2

Parse an array

Parse an array of n 32-bit signed integers.

import Text.Parsing.Parser (runParserT)
import Text.Parsing.Parser.DataView (anyUint32be)
import Data.Unfoldable (replicateA)

  result <- runParserT dataview $ replicateA n anyInt32be

Parse UTF8

Parse a String as UTF8 with a length prefix.

We give this as an example, rather than supporting it in the library, because it depends on Data.TextDecoding.decodeUtf8.

import Control.Monad.Trans.Class (lift)
import Data.ArrayBuffer.Types (DataView, Uint8Array)
import Data.ArrayBuffer.DataView (buffer, byteOffset, byteLength)
import Data.ArrayBuffer.Typed (part)
import Effect (Effect, liftEffect)
import Text.Parsing.Parser (runParserT, fail)
import Text.Parsing.Parser.DataView (anyUint32be, takeN)
import Data.UInt (toInt)
import Data.Text.Decoding (decodeUtf8)

mkUint8Array :: DataView -> Effect Uint8Array
mkUint8Array dv = part (buffer dv) (byteOffset dv) (byteLength dv)

  result <- runParserT dataview $ do
    -- Parse a 32-bit big-endian length prefix for the length of the utf8 string,
    -- in bytes.
    length      <- anyUint32be
    stringview  <- takeN $ toInt length
    stringarray <- lift $ liftEffect $ mkUint8Array stringview
    case decodeUtf8 stringarray of
      Left err -> fail $ show err
      Right s  -> pure s


This package is for reading (DataViews on) ArrayBuffers, not writing them. See the package arraybuffer-builder for a way to serialize and build ArrayBuffers.