diff --git a/src/MA/Coalgebra/Parser.hs b/src/MA/Coalgebra/Parser.hs index b190bbc93bb4331d7c12bd2654e8962cab1f607e..b2faf2cab8caa006d75a0fb85a1cff874c63e3c1 100644 --- a/src/MA/Coalgebra/Parser.hs +++ b/src/MA/Coalgebra/Parser.hs @@ -13,7 +13,7 @@ module MA.Coalgebra.Parser , module MA.Coalgebra.Parser.Class ) where -import Control.Monad (void) +import Control.Monad (void, forM_) import Data.Bifunctor import Data.Tuple import Data.Void (Void) @@ -25,6 +25,7 @@ import qualified Data.Text as T import Lens.Micro.Platform import Text.Megaparsec hiding (State) import qualified Data.Vector as V +import qualified Data.Vector.Mutable as VM import Control.DeepSeq (NFData) import Data.MorphismEncoding (Encoding, State) @@ -80,10 +81,10 @@ finalizeState :: forall f. finalizeState state = let h1s = state ^. h1Map - h1Vec = V.generate (M.size h1s) $ \i -> - case M.lookup i h1s of - Nothing -> error "should not happen" -- FIXME: Handle this case better - Just x -> x + h1Vec = V.create $ do + v <- VM.unsafeNew (M.size h1s) + forM_ (M.toList h1s) $ \(i, h1) -> VM.unsafeWrite v i h1 + return v !edges = V.concat (state ^. graph) !symTab = M.fromList (map swap (M.toList (fmap fst (state ^. symbolTable))))