-- | Work around Nix regression causing corruption when EvalState is destroyed and a new one created. module SingleState (withGlobalState, evalState) where import Data.IORef (IORef, newIORef, readIORef, writeIORef) import Hercules.CNix.Expr import Hercules.CNix.Store.TestUtil (withTempStore) import Protolude hiding (evalState, state) import System.IO.Unsafe (unsafePerformIO) theEvalState :: IORef (Ptr EvalState) theEvalState = unsafePerformIO $ newIORef (panic "Store not initialized yet") {-# NOINLINE theEvalState #-} -- | Work around Nix regression causing corruption when EvalState is destroyed and a new one created. withGlobalState :: IO () -> IO () withGlobalState io = withTempStore $ \store -> withEvalState store $ \state -> do writeIORef theEvalState state io -- | Work around Nix regression causing corruption when EvalState is destroyed and a new one created. evalState :: Ptr EvalState evalState = unsafePerformIO $ readIORef theEvalState {-# NOINLINE evalState #-}