packages feed

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)