packages feed

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