packages feed

acolyte-server-0.1.0.0: src/Acolyte/Server/CombineEffects.hs

-- | Backward-compatible aliases for combined effect-tracked servers.
--
-- 'CombinedServer' is now a type alias for 'EffectfulServer'.
-- 'provideEffect' and 'runCombined' are aliases for 'provide' and 'run'.
-- 'combinedFromRouter' is an alias for 'fromRouter'.
--
-- New code should use 'EffectfulServer', 'provide', 'run', and
-- 'fromRouter' directly from "Acolyte.Server.Effects".
module Acolyte.Server.CombineEffects
  ( -- * Combined effectful server (aliases)
    CombinedServer
  , combinedFromRouter
    -- * Effect tracking (aliases)
  , provideEffect
  , runCombined
  ) where

import Data.ByteString (ByteString)
import Data.Kind (Type)

import Spire (Middleware)
import Http.Core (Request, Response)

import Acolyte.Core.Effect (AllEffectsProvided)
import Acolyte.Server.Router (Router)
import Acolyte.Server.Effects
  ( EffectfulServer, fromRouter, provide, run )
import Spire.Service (Service)


-- | Alias for 'EffectfulServer'. Kept for backward compatibility.
type CombinedServer = EffectfulServer

-- | Alias for 'fromRouter'. Kept for backward compatibility.
combinedFromRouter
  :: forall fullApi
   . Router
  -> EffectfulServer fullApi '[]
combinedFromRouter = fromRouter
{-# INLINE combinedFromRouter #-}

-- | Alias for 'provide'. Kept for backward compatibility.
provideEffect
  :: forall e fullApi provided
   . Middleware IO (Request ByteString) (Response ByteString)
  -> EffectfulServer fullApi provided
  -> EffectfulServer fullApi (e ': provided)
provideEffect = provide @e
{-# INLINE provideEffect #-}

-- | Alias for 'run'. Kept for backward compatibility.
runCombined
  :: forall fullApi provided
   . AllEffectsProvided fullApi provided
  => EffectfulServer fullApi provided
  -> Service IO (Request ByteString) (Response ByteString)
runCombined = run
{-# INLINE runCombined #-}