module PureSAT.LitTable where

import PureSAT.Base
import PureSAT.LitVar
import PureSAT.Prim

-------------------------------------------------------------------------------
-- LitTable
-------------------------------------------------------------------------------

newtype LitTable s a = LitT (MutableArray s a)

newLitTable :: Int -> a -> ST s (LitTable s a)
newLitTable :: forall a s. Int -> a -> ST s (LitTable s a)
newLitTable !Int
size a
x = do
    xs <- Int -> a -> ST s (MutableArray (PrimState (ST s)) a)
forall (m :: * -> *) a.
PrimMonad m =>
Int -> a -> m (MutableArray (PrimState m) a)
newArray Int
size a
x
    return (LitT xs)

sizeofLitTable :: LitTable s a -> ST s Int
sizeofLitTable :: forall s a. LitTable s a -> ST s Int
sizeofLitTable (LitT MutableArray s a
arr) = Int -> ST s Int
forall a. a -> ST s a
forall (m :: * -> *) a. Monad m => a -> m a
return (MutableArray s a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray s a
arr)

readLitTable :: LitTable s a -> Lit -> ST s a
readLitTable :: forall s a. LitTable s a -> Lit -> ST s a
readLitTable (LitT MutableArray s a
xs) (MkLit Int
l) = do
    String -> Bool -> ST s ()
forall s. HasCallStack => String -> Bool -> ST s ()
assertST String
"readLitTable" (Bool -> ST s ()) -> Bool -> ST s ()
forall a b. (a -> b) -> a -> b
$ Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< MutableArray s a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray s a
xs
    MutableArray s a -> Int -> ST s a
forall s a. HasCallStack => MutableArray s a -> Int -> ST s a
readArray MutableArray s a
xs Int
l

writeLitTable :: LitTable s a -> Lit -> a -> ST s ()
writeLitTable :: forall s a. LitTable s a -> Lit -> a -> ST s ()
writeLitTable (LitT MutableArray s a
xs) (MkLit Int
l) a
x = do
    String -> Bool -> ST s ()
forall s. HasCallStack => String -> Bool -> ST s ()
assertST String
"readLitTable" (Bool -> ST s ()) -> Bool -> ST s ()
forall a b. (a -> b) -> a -> b
$ Int
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< MutableArray s a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray s a
xs
    MutableArray s a -> Int -> a -> ST s ()
forall s a. HasCallStack => MutableArray s a -> Int -> a -> ST s ()
writeArray MutableArray s a
xs Int
l a
x