diff --git a/ips.cabal b/ips.cabal index 2527b4a..4ccb050 100644 --- a/ips.cabal +++ b/ips.cabal @@ -10,6 +10,7 @@ maintainer: rhiannon morris common deps default-language: Haskell2010 default-extensions: + BangPatterns, BlockArguments, DerivingStrategies, DuplicateRecordFields, diff --git a/src/IPS/Parse.hs b/src/IPS/Parse.hs index f0f82f4..228fe76 100644 --- a/src/IPS/Parse.hs +++ b/src/IPS/Parse.hs @@ -5,7 +5,6 @@ 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 @@ -24,7 +23,7 @@ parseBody = uncurry Vector.fromListN <$> go where go = eof <|> chunk eof = Parse.string "EOF" $> (0, []) chunk = liftA2 cons parseChunk go - where cons c = bimap (+ 1) (c :) + where cons c (!n, cs) = (n + 1, c : cs) parseChunk :: Parser Chunk parseChunk = do @@ -45,7 +44,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)