module React.Registry where
import qualified Data.HashMap.Strict as H
import Data.IORef
import React.Imports
data RegistryStuff props state insig exsig = RegistryStuff
{ registryProps :: props
, registryState :: state
, registryHandler :: insig -> IO ()
}
data ClassRegistry props state insig exsig = ClassRegistry
{ registryStuff :: IORef (H.HashMap Int (RegistryStuff props state insig exsig))
, registryGen :: IORef Int
}
generateKey :: ClassRegistry props state insig exsig -> IO Int
generateKey (ClassRegistry _ gen) = do
k <- readIORef gen
writeIORef gen (k + 1)
return k
allocProps :: ClassRegistry props state insig exsig
-> props
-> IO Int
allocProps registry props = do
k <- generateKey registry
modifyIORef (registryStuff registry) $
H.insert k (RegistryStuff props undefined undefined)
return k
setHandler :: ClassRegistry props state insig exsig
-> (insig -> IO ())
-> Int
-> IO ()
setHandler registry handler k =
modifyIORef (registryStuff registry) $
H.adjust (\(RegistryStuff p s _) -> RegistryStuff p s handler) k
setState :: ClassRegistry props state insig exsig -> state -> Int -> IO ()
setState registry state k =
modifyIORef (registryStuff registry) $
H.adjust (\(RegistryStuff p _ h) -> RegistryStuff p state h) k
deallocRegistry :: ClassRegistry props state insig exsig -> Int -> IO ()
deallocRegistry (ClassRegistry stuff _) k = modifyIORef stuff (H.delete k)
lookupRegistry :: ClassRegistry props state insig exsig
-> Int
-> IO (RegistryStuff props state insig exsig)
lookupRegistry (ClassRegistry stuff _) k = do
stuff' <- readIORef stuff
return $ H.lookupDefault
(error $ "class registry didn't contain an entry!\n" ++
"componentId: " ++ show k ++ "\n" ++
"keys: " ++ show (H.keys stuff') ++ "\n"
)
k
stuff'