Compare commits

..

No commits in common. "fff25999c9f0eedfca678f8c99eb89a69f69ada4" and "1500c62e5167e66fac42421a0268833cc1668f45" have entirely different histories.

2 changed files with 7 additions and 7 deletions

View File

@ -10,7 +10,6 @@ maintainer: rhiannon morris <rhi@rhiannon.website>
common deps
default-language: Haskell2010
default-extensions:
BangPatterns,
BlockArguments,
DerivingStrategies,
DuplicateRecordFields,

View File

@ -5,6 +5,7 @@ import IPS.Types
import Data.Attoparsec.ByteString (Parser)
import qualified Data.Attoparsec.ByteString as Parse
import Data.Bits
import Data.Bifunctor
import qualified Data.ByteString as ByteString
import Data.Functor
import qualified Data.Vector.Generic as Vector
@ -23,17 +24,17 @@ parseBody = uncurry Vector.fromListN <$> go where
go = eof <|> chunk
eof = Parse.string "EOF" $> (0, [])
chunk = liftA2 cons parseChunk go
where cons c (!n, cs) = (n + 1, c : cs)
where cons c = bimap (+ 1) (c :)
parseChunk :: Parser Chunk
parseChunk = do
offset <- parseWord24
size <- parseWord16
size <- parseWord16
body <-
if size == 0 then
if size == 0 then
liftA2 RLE parseWord16 Parse.anyWord8
else
Normal . makeBytes <$> Parse.take (fromIntegral size)
Normal . makeBytes <$> Parse.take (fromIntegral size)
pure $ Chunk {offset, body}
parseWord16 :: Parser Word16
@ -44,7 +45,7 @@ parseWord24 = parseWordBE 3
parseWordBE :: (Integral a, Bits a) => Word -> Parser a
parseWordBE = go 0 where
go !acc 0 = pure acc
go !acc i = do
go acc 0 = pure acc
go acc i = do
b <- fromIntegral <$> Parse.anyWord8
go ((acc `shiftL` 8) .|. b) (i - 1)