module NetworkedGame.Handles
 (ConnectionId(..), Handles,
  emptyHandles, removeHandle, lookupHandle,
  nullHandles, addHandle, forHandles_)
 where

import Data.Foldable (forM_)
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
import System.IO (Handle)

newtype Handles = Handles (IntMap Handle)

newtype ConnectionId = ConnectionId Int
  deriving (Eq, Show, Ord, Read)

emptyHandles :: Handles
emptyHandles = Handles IntMap.empty

addHandle :: ConnectionId -> Handle -> Handles -> Handles
addHandle (ConnectionId i) h (Handles hs) = Handles (IntMap.insert i h hs)

removeHandle :: ConnectionId -> Handles -> Handles
removeHandle (ConnectionId i) (Handles hs) = Handles (IntMap.delete i hs)

lookupHandle :: ConnectionId -> Handles -> Maybe Handle
lookupHandle (ConnectionId i) (Handles m) = IntMap.lookup i m

nullHandles :: Handles -> Bool
nullHandles (Handles m) = IntMap.null m

forHandles_ :: Monad m => Handles -> (Handle -> m a) -> m ()
forHandles_ (Handles m) f = forM_ m f