lvish-1.1.1.1: Data/LVar/NatArray/Unsafe.hs
{-# LANGUAGE GADTs #-}
-- | Unsafe operations on NatArray. NOT for end-user applications.
module Data.LVar.NatArray.Unsafe
( NatArray(..), unsafePeek )
where
import qualified Data.Vector.Storable.Mutable as M
import Foreign.Storable (sizeOf, Storable)
-- import System.IO.Unsafe (unsafeDupablePerformIO)
import Control.LVish.Internal as LI
------------------------------------------------------------------------------------------
-- | An array of bit-fields with a monotonic OR operation. This can be used to model
-- a set of Ints by setting the vector entries to zero or one, but it can also
-- model other finite lattices for each index.
-- newtype NatArray s a = NatArray (LVar s (M.IOVector a) (Int,a))
data NatArray s a = Storable a => NatArray !(LVar s (M.IOVector a) (Int,a))
unsafePeek :: (Num a, Eq a) => NatArray s a -> Int -> Par d s (Maybe a)
unsafePeek (NatArray lv) ix = do
peek <- LI.liftIO $ M.read (LI.state lv) ix
case peek of
-- TODO: generalize:
0 -> return Nothing
x -> return $! Just x