-----------------------------------------------------------------------------
-- |
  Module       :   
  Copyright    :   ( c )   2002
-- License     :  BSD-style
-- 
-- Maintainer  :  
-- Stability   :  provisional
-- Portability :  portable
--
  StdId specifies the generation functions for identification values .
--
-----------------------------------------------------------------------------

module Graphics.UI.ObjectIO.StdId
		( openId,  openRId,  openR2Id
	     	, openIds, openRIds, openR2Ids
             	, getParentId
             	, Graphics.UI.ObjectIO.Id.Id
             	) where


import Graphics.UI.ObjectIO.Id
import Graphics.UI.ObjectIO.StdIOBasic(IOMonad(..))
import Graphics.UI.ObjectIO.Process.IOState(GUI(..),ioStGetIdTable)
import Data.Maybe
import Data.Unique
import Data.IORef
import qualified Data.Map as Map
import System.IO.Unsafe

------------
------------

  | The openId function generates one new i d
openId  :: IOMonad m => m Id
openId  = liftIO (fmap toId newUnique)

-- | The openIds function returns a list of N new items i.e. [id1, id2..idN]
openIds   :: IOMonad m => Int -> m [Id]
openIds n = sequence (replicate n openId)

-- | The openRId function is the same as openId but they return 
-- special bi-receiver id (see "Graphics.UI.ObjectIO.StdReceiver").
openR2Id  :: IOMonad m => m (R2Id msg resp)
openR2Id  = liftIO $ do
	u   <- newUnique
	cIn  <- newIORef undefined
	cOut <- newIORef undefined
	return (toR2Id u cIn cOut)

  | The openR2Ids function returns a list of N new bi - receiver ids i.e. [ rId1 , rId2 .. rIdN ]
openR2Ids :: IOMonad m => Int -> m [R2Id msg resp]
openR2Ids n = sequence (replicate n openR2Id)

-- | The openRId function is the same as openId but they return 
-- special bi-receiver id (see "Graphics.UI.ObjectIO.StdReceiver").
openRId  :: IOMonad m => m (RId msg)	
openRId = liftIO $ do
	u   <- newUnique
	cIn  <- newIORef []
	return (toRId u cIn)

-- | The openRIds function returns a list of N new receiver ids i.e. [rId1, rId2..rIdN]
openRIds :: IOMonad m => Int -> m [RId msg]
openRIds n = sequence (replicate n openRId)

  | The getParentId function retrieves an i d of the specified window\ 's parent .
getParentId :: Id -> GUI ps (Maybe Id)
getParentId id = do
	it <- ioStGetIdTable
	return (fmap idpId (Map.lookup id it))

---------------------------------------------------------------------------
 |
 License     :  BSD-style
 
 Maintainer  :  
 Stability   :  provisional
 Portability :  portable


---------------------------------------------------------------------------
----------
----------
 | The openIds function returns a list of N new items i.e. [id1, id2..idN]
 | The openRId function is the same as openId but they return 
 special bi-receiver id (see "Graphics.UI.ObjectIO.StdReceiver").
 | The openRId function is the same as openId but they return 
 special bi-receiver id (see "Graphics.UI.ObjectIO.StdReceiver").
 | The openRIds function returns a list of N new receiver ids i.e. [rId1, rId2..rIdN]
  Module       :   
  Copyright    :   ( c )   2002
  StdId specifies the generation functions for identification values .

module Graphics.UI.ObjectIO.StdId
		( openId,  openRId,  openR2Id
	     	, openIds, openRIds, openR2Ids
             	, getParentId
             	, Graphics.UI.ObjectIO.Id.Id
             	) where


import Graphics.UI.ObjectIO.Id
import Graphics.UI.ObjectIO.StdIOBasic(IOMonad(..))
import Graphics.UI.ObjectIO.Process.IOState(GUI(..),ioStGetIdTable)
import Data.Maybe
import Data.Unique
import Data.IORef
import qualified Data.Map as Map
import System.IO.Unsafe


  | The openId function generates one new i d
openId  :: IOMonad m => m Id
openId  = liftIO (fmap toId newUnique)

openIds   :: IOMonad m => Int -> m [Id]
openIds n = sequence (replicate n openId)

openR2Id  :: IOMonad m => m (R2Id msg resp)
openR2Id  = liftIO $ do
	u   <- newUnique
	cIn  <- newIORef undefined
	cOut <- newIORef undefined
	return (toR2Id u cIn cOut)

  | The openR2Ids function returns a list of N new bi - receiver ids i.e. [ rId1 , rId2 .. rIdN ]
openR2Ids :: IOMonad m => Int -> m [R2Id msg resp]
openR2Ids n = sequence (replicate n openR2Id)

openRId  :: IOMonad m => m (RId msg)	
openRId = liftIO $ do
	u   <- newUnique
	cIn  <- newIORef []
	return (toRId u cIn)

openRIds :: IOMonad m => Int -> m [RId msg]
openRIds n = sequence (replicate n openRId)

  | The getParentId function retrieves an i d of the specified window\ 's parent .
getParentId :: Id -> GUI ps (Maybe Id)
getParentId id = do
	it <- ioStGetIdTable
	return (fmap idpId (Map.lookup id it))
