{-# LANGUAGE MagicHash, UnboxedTuples #-}
module Mikan.Utils.CompactRegion
( Compact
, new
, add
, compact
)
where
import Control.DeepSeq
import GHC.Exts
import GHC.Types
import GHC.Word
import System.IO.Unsafe (unsafePerformIO)
data Compact = Compact Compact#
instance NFData Compact where
rnf :: Compact -> ()
rnf !Compact
x = ()
{-# INLINE new #-}
new :: Word -> IO Compact
new :: Word -> IO Compact
new (W# Word#
size) = (State# RealWorld -> (# State# RealWorld, Compact #)) -> IO Compact
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO \State# RealWorld
s -> case Word# -> State# RealWorld -> (# State# RealWorld, Compact# #)
compactNew# Word#
size State# RealWorld
s of
(# State# RealWorld
s, Compact#
com #) -> (# State# RealWorld
s, Compact# -> Compact
Compact Compact#
com #)
{-# INLINE add #-}
add :: Compact -> a -> IO a
add :: forall a. Compact -> a -> IO a
add (Compact Compact#
com) a
a = (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (Compact# -> a -> State# RealWorld -> (# State# RealWorld, a #)
forall a.
Compact# -> a -> State# RealWorld -> (# State# RealWorld, a #)
compactAdd# Compact#
com a
a)
{-# NOINLINE compact #-}
compact :: Word -> a -> a
compact :: forall a. Word -> a -> a
compact Word
size a
a =
IO a -> a
forall a. IO a -> a
unsafePerformIO do
!arena <- Word -> IO Compact
new Word
size
add arena a