module Remote.Reg (
registerCalls,
Lookup,
Identifier,
putReg,
getEntryByIdent,
empty,
RemoteCallMetaData
) where
import Data.Dynamic (Dynamic,toDyn,fromDynamic)
import Data.Typeable (Typeable)
import qualified Data.Map as Map (insert,lookup,Map,empty)
type RemoteCallMetaData = Lookup -> Lookup
type Identifier = String
data Entry = Entry {
entryName :: Identifier,
entryFunRef :: Dynamic
}
registerCalls :: [RemoteCallMetaData] -> Lookup
registerCalls [] = empty
registerCalls (h:rest) = let registered = registerCalls rest
in h registered
makeEntry :: (Typeable a) => Identifier -> a -> Entry
makeEntry ident funref = Entry {entryName=ident, entryFunRef=toDyn funref}
type IdentMap = Map.Map Identifier Entry
data Lookup = Lookup { identMap :: IdentMap }
putReg :: (Typeable a) => a -> Identifier -> Lookup -> Lookup
putReg a i l = putEntry l a i
putEntry :: (Typeable a) => Lookup -> a -> Identifier -> Lookup
putEntry amap value name =
Lookup {
identMap = Map.insert name entry (identMap amap)
}
where
entry = makeEntry name value
getEntryByIdent :: (Typeable a) => Lookup -> Identifier -> Maybe a
getEntryByIdent amap ident = (Map.lookup ident (identMap amap)) >>= (\x -> fromDynamic (entryFunRef x))
empty :: Lookup
empty = Lookup {identMap = Map.empty}