packages feed

curryer-rpc-0.1: examples/SimpleKeyValueServer.hs

{-# LANGUAGE DerivingVia, DeriveGeneric #-}
import Network.RPC.Curryer.Server
import Control.Concurrent.STM
import StmContainers.Map as M
import GHC.Generics
import Codec.Winery
import Data.Functor

-- create data structures to represent remote function calls
data SetKey = SetKey String String
  deriving (Generic, Show)
  deriving Serialise via WineryVariant SetKey

data GetKey = GetKey String
  deriving (Generic, Show)
  deriving Serialise via WineryVariant GetKey

--call the `serve` function to handle incoming requests
main :: IO ()
main = do
  kvmap <- M.newIO
  void $ serve kvRequestHandlers kvmap localHostAddr 8765 Nothing

-- setup incoming request handlers to operate on the server's state
kvRequestHandlers :: RequestHandlers (M.Map String String)
kvRequestHandlers = [ RequestHandler $ \state (SetKey k v) ->
                        atomically $ M.insert v k (connectionServerState state)
                    , RequestHandler $ \state (GetKey k) ->
                        atomically $ M.lookup k (connectionServerState state)
                    ]