on master help sign in
roboservant/test/UnsafeIO.hs
39 lines 933 B history raw
1{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE DerivingStrategies #-}
5{-# LANGUAGE OverloadedStrings #-}
6{-# LANGUAGE TypeOperators #-}
8module UnsafeIO where
10import Control.Monad.Trans (MonadIO (liftIO))
11import Data.Aeson ()
12import qualified Data.ByteString.Lazy.Char8 as BL8
13import Data.IORef (IORef, newIORef, readIORef, writeIORef)
14import Servant
16type UnsafeApi =
17 "add" :> Get '[JSON] ()
18 :<|> "healthcheck" :> Get '[JSON] ()
20healthcheck :: IORef Int -> Handler ()
21healthcheck ref = do
22 t <- liftIO $ readIORef ref
23 case t of
24 0 -> pure ()
25 n -> throwError $ err500 {errBody = "observed inconsistency: " <> BL8.pack (show n)}
27makeServer :: IO (Server UnsafeApi)
28makeServer = do
29 ref <- newIORef 0
30 pure $
31 unsafeMunge ref
32 :<|> healthcheck ref
34unsafeMunge :: IORef Int -> Handler ()
35unsafeMunge ref = liftIO $ do
36 t <- readIORef ref
37 writeIORef ref (t + 1)
38 t2 <- readIORef ref
39 writeIORef ref (t2 -1)