{-# language BangPatterns #-} import Data.Primitive.Unlifted.TVar import Data.Primitive import Control.Monad.STM main :: IO () main = do putStrLn "Start" putStrLn "A" testA putStrLn "B" testB putStrLn "Finished" testA :: IO () testA = do tv <- newUnliftedTVarIO =<< newByteArray 16 marr <- newByteArray 8 !r <- atomically $ do writeUnliftedTVar tv marr !s <- readUnliftedTVar tv pure s if sameMutableByteArray marr r then pure () else fail "" testB :: IO () testB = do tv <- newUnliftedTVarIO =<< newByteArray 16 !_ <- readUnliftedTVarIO tv pure ()