module Data.Registry.Class where
import Control.Monad
import Control.Monad.IO.Class
import Data.Maybe (isJust)
import qualified Data.Text as T
import qualified Data.Vector.Mutable as VM
class IRegistry reg where
has :: MonadIO m => reg v -> T.Text -> m Bool
has reg k = fmap isJust $ reg !? k
(!) :: MonadIO m => reg v -> T.Text -> m v
reg ! k = fmap (\(Just a) -> a) $ reg !? k
(!?) :: MonadIO m => reg v -> T.Text -> m (Maybe v)
update :: MonadIO m => reg v -> T.Text -> (v -> m v) -> m ()
update reg k f = reg ! k >>= \v -> f v >>= \v' -> write reg k v'
write :: MonadIO m => reg v -> T.Text -> v -> m ()
register :: MonadIO m => reg v -> T.Text -> v -> m ()
insert :: MonadIO m => reg v -> Int -> T.Text -> v -> m ()
delete :: MonadIO m => reg v -> T.Text -> m ()
asVec :: reg v -> VM.IOVector v
infixl 9 !
infixl 9 !?
forV_ :: (MonadIO m, IRegistry reg) => reg v -> (v -> m ()) -> m ()
forV_ reg iter =
let vec = asVec reg
in forM_ [0 .. VM.length vec - 1] $ \i -> liftIO (VM.read vec i) >>= iter
iforV_ :: (MonadIO m, IRegistry reg) => reg v -> (Int -> v -> m ()) -> m ()
iforV_ reg iter =
let vec = asVec reg
in forM_ [0 .. VM.length vec - 1] $ \i -> liftIO (VM.read vec i) >>= iter i
modifyV_ :: (MonadIO m, IRegistry reg) => reg v -> (v -> m v) -> m ()
modifyV_ reg iter = iforV_ reg $ \i v -> do
v' <- iter v
liftIO $ VM.write (asVec reg) i v'