content: -- ----------------------------------------------------------------------------
  {- |
    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
  