azure-functions-worker-0.0.0.0: src/Azure/Functions/Internal/Runtime.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StrictData #-}
module Azure.Functions.Internal.Runtime
where
import Azure.Functions.Registry (RegisteredFunction (..))
import Control.Concurrent.STM.TVar (TVar, modifyTVar', newTVarIO, readTVarIO)
import Control.Monad.STM (atomically)
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Text (Text)
import GHC.Generics (Generic)
import Proto.FunctionRpc
type FunctionId = Text
data RunningFunction = RunningFunction
{ runningFunction :: InvocationRequest -> IO InvocationResponse
} deriving (Generic)
data Runtime = Runtime
{ runtimeFunctions :: TVar (Map Text RunningFunction)
}
createRuntime :: IO Runtime
createRuntime = Runtime <$> newTVarIO mempty
loadRuntimeFunction :: Runtime -> FunctionId -> RegisteredFunction -> IO ()
loadRuntimeFunction runtime fid RegisteredFunction{registeredEnvFactory, registeredFunction} = do
func <- registeredFunction <$> registeredEnvFactory
atomically $ do
modifyTVar' (runtimeFunctions runtime) $ Map.insert fid (RunningFunction func)
getRuntimeFunction :: Runtime -> FunctionId -> IO (Maybe RunningFunction)
getRuntimeFunction runtime fid = do
Map.lookup fid <$> readTVarIO (runtimeFunctions runtime)