-- | Collection of handlers
--
-- This is not part of grapesy's public API.
--
-- Intended for qualified import.
--
-- > import Network.GRPC.Server.HandlerMap (HandlerMap)
-- > import Network.GRPC.Server.HandlerMap qualified as HandlerMap
module Network.GRPC.Server.HandlerMap (
    -- * Definition
    HandlerMap -- opaque
    -- * Construction
  , fromList
    -- * Query
  , lookup
  , keys
  ) where

import Prelude hiding (lookup)

import Data.HashMap.Strict (HashMap)
import Data.HashMap.Strict qualified as HashMap

import Network.GRPC.Spec
import Network.GRPC.Server.Handler

{-------------------------------------------------------------------------------
  Definition
-------------------------------------------------------------------------------}

newtype HandlerMap m = HandlerMap {
      forall (m :: * -> *).
HandlerMap m -> HashMap Path (SomeRpcHandler m)
getMap :: HashMap Path (SomeRpcHandler m)
    }

{-------------------------------------------------------------------------------
  Construction
-------------------------------------------------------------------------------}

fromList :: [SomeRpcHandler m] -> HandlerMap m
fromList :: forall (m :: * -> *). [SomeRpcHandler m] -> HandlerMap m
fromList = HashMap Path (SomeRpcHandler m) -> HandlerMap m
forall (m :: * -> *).
HashMap Path (SomeRpcHandler m) -> HandlerMap m
HandlerMap (HashMap Path (SomeRpcHandler m) -> HandlerMap m)
-> ([SomeRpcHandler m] -> HashMap Path (SomeRpcHandler m))
-> [SomeRpcHandler m]
-> HandlerMap m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Path, SomeRpcHandler m)] -> HashMap Path (SomeRpcHandler m)
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList ([(Path, SomeRpcHandler m)] -> HashMap Path (SomeRpcHandler m))
-> ([SomeRpcHandler m] -> [(Path, SomeRpcHandler m)])
-> [SomeRpcHandler m]
-> HashMap Path (SomeRpcHandler m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SomeRpcHandler m -> (Path, SomeRpcHandler m))
-> [SomeRpcHandler m] -> [(Path, SomeRpcHandler m)]
forall a b. (a -> b) -> [a] -> [b]
map (\SomeRpcHandler m
h -> (SomeRpcHandler m -> Path
forall (m :: * -> *). SomeRpcHandler m -> Path
path SomeRpcHandler m
h, SomeRpcHandler m
h))

{-------------------------------------------------------------------------------
  Query
-------------------------------------------------------------------------------}

lookup :: Path -> HandlerMap m -> Maybe (SomeRpcHandler m)
lookup :: forall (m :: * -> *).
Path -> HandlerMap m -> Maybe (SomeRpcHandler m)
lookup Path
p = Path -> HashMap Path (SomeRpcHandler m) -> Maybe (SomeRpcHandler m)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup Path
p (HashMap Path (SomeRpcHandler m) -> Maybe (SomeRpcHandler m))
-> (HandlerMap m -> HashMap Path (SomeRpcHandler m))
-> HandlerMap m
-> Maybe (SomeRpcHandler m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HandlerMap m -> HashMap Path (SomeRpcHandler m)
forall (m :: * -> *).
HandlerMap m -> HashMap Path (SomeRpcHandler m)
getMap

keys :: HandlerMap m -> [Path]
keys :: forall (m :: * -> *). HandlerMap m -> [Path]
keys = HashMap Path (SomeRpcHandler m) -> [Path]
forall k v. HashMap k v -> [k]
HashMap.keys (HashMap Path (SomeRpcHandler m) -> [Path])
-> (HandlerMap m -> HashMap Path (SomeRpcHandler m))
-> HandlerMap m
-> [Path]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HandlerMap m -> HashMap Path (SomeRpcHandler m)
forall (m :: * -> *).
HandlerMap m -> HashMap Path (SomeRpcHandler m)
getMap

{-------------------------------------------------------------------------------
  Internal auxiliary
-------------------------------------------------------------------------------}

path :: forall m. SomeRpcHandler m -> Path
path :: forall (m :: * -> *). SomeRpcHandler m -> Path
path (SomeRpcHandler Proxy rpc
rpc RpcHandler m rpc
_handler) = Proxy rpc -> Path
forall {k} (rpc :: k). IsRPC rpc => Proxy rpc -> Path
rpcPath Proxy rpc
rpc