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 |
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 big-endian IEEE 754 double-precision floats.
import Text.Parsing.Parser (runParserT)
import Text.Parsing.Parser.DataView (anyFloat64be)
do
result <- runParserT dataview $ do
float1 <- anyFloat64be
float2 <- anyFloat64be
pure $ Tuple float1 float2Parse an array of n 32-bit signed integers.
import Text.Parsing.Parser (runParserT)
import Text.Parsing.Parser.DataView (anyUint32be)
import Data.Unfoldable (replicateA)
do
result <- runParserT dataview $ replicateA n anyInt32beParse 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)
do
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 sThis package is for reading (DataViews on) ArrayBuffers, not writing
them. See the package
arraybuffer-builder
for a way to
serialize and build ArrayBuffers.