Holumbus-Distribution-0.1.0: source/Holumbus/Network/PortRegistry.hs
-- ----------------------------------------------------------------------------
{- |
Module : Holumbus.Network.PortRegistry
Copyright : Copyright (C) 2008 Stefan Schmidt
License : MIT
Maintainer : Stefan Schmidt (stefanschmidt@web.de)
Stability : experimental
Portability: portable
Version : 0.1
The typeclass for the PortRegistry. Contains all PortRegistry functions which
can accessed remotely by the clients.
-}
-- ----------------------------------------------------------------------------
{-# OPTIONS -fglasgow-exts #-}
module Holumbus.Network.PortRegistry
{-# DEPRECATED "this module will be remove in the next release, please use the packages from Holumbus.Distribution.*" #-}
(
-- * Type-Classes
PortRegistry(..)
-- * GenericRegistry
, GenericRegistry
, mkGenericRegistry
)
where
import Holumbus.Network.Core
-- ----------------------------------------------------------------------------
-- Type-Class
-- ----------------------------------------------------------------------------
-- | The Interface of the PortRegistry.
class PortRegistry pr where
-- | Creates a new port entry in the registry.
registerPort :: String -> SocketId -> pr -> IO ()
-- | Deletes an entry from the registry.
unregisterPort :: String -> pr -> IO ()
-- | Get the socket of the port by its name.
lookupPort :: String -> pr -> IO (Maybe SocketId)
-- | Get a list of all registered ports.
getPorts :: pr -> IO [(String, SocketId)]
-- ----------------------------------------------------------------------------
-- GenericRegistry
-- ----------------------------------------------------------------------------
-- | The generic registry object.
-- This is a wrapper around an PortRegistryData or PortRegistryPort object.
-- With this additional indirection, we eliminate the distinction between
-- the port or the data object in the datatypes using the PortRegistry.
-- Therefore it is easier to get access to the registry and the code gets
-- more readable.
-- This might be a good example of hiding network-access. To the caller it
-- makes no difference, if the PortRegistry is in the same address space of
-- on another computer in the network.
data GenericRegistry = forall r. (PortRegistry r) => GenericRegistry r
-- | Creates a new generic PortRegistry.
mkGenericRegistry :: (PortRegistry r) => r -> GenericRegistry
mkGenericRegistry = GenericRegistry
instance PortRegistry GenericRegistry where
registerPort sn soid (GenericRegistry r) = registerPort sn soid r
unregisterPort sn (GenericRegistry r) = unregisterPort sn r
lookupPort sn (GenericRegistry r) = lookupPort sn r
getPorts (GenericRegistry r) = getPorts r