packages feed

roboservant-0.1.0.0: test/UnsafeIO.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}

module UnsafeIO where

import Data.Aeson()
import Servant
import Data.IORef (writeIORef, IORef, readIORef, newIORef)
import Control.Monad.Trans (MonadIO(liftIO))
import qualified Data.ByteString.Lazy.Char8 as BL8


type UnsafeApi =
  "add" :> Get '[JSON] ()
  :<|> "healthcheck" :> Get '[JSON] ()

healthcheck :: IORef Int -> Handler ()
healthcheck ref = do
  t <- liftIO $ readIORef ref
  case t of
    0 -> pure ()
    n -> throwError $ err500 {errBody = "observed inconsistency: " <> (BL8.pack $ show n)}



makeServer :: IO (Server UnsafeApi)
makeServer = do
  ref <- newIORef 0
  pure $ unsafeMunge ref
    :<|> healthcheck ref

unsafeMunge :: IORef Int -> Handler ()
unsafeMunge ref = liftIO $ do
  t <- readIORef ref
  writeIORef ref (t+1)
  t2 <- readIORef ref
  writeIORef ref (t2-1)