{-# LANGUAGE TemplateHaskell #-}

module Network.Miku.Type where

import           Control.Lens
import           Control.Lens.TH
import           Control.Monad.Identity
import           Control.Monad.Reader
import           Control.Monad.State
import           Data.ByteString.Char8       (ByteString)
import           Data.Monoid
import           Network.Wai
import qualified Network.HTTP.Types           as H

type AppReader    = Request
type AppState     = Response
type AppMonadT    = ReaderT AppReader (StateT AppState IO)
type AppMonad     = AppMonadT ()


data MikuState = MikuState
  {
    _middlewares :: [Middleware]
  , _router      :: [Middleware]
  }

instance Monoid MikuState where
   mempty = MikuState [] []
   mappend (MikuState x y) (MikuState x' y') = MikuState (x <> x') (y <> y')

makeLenses ''MikuState

type MikuMonadT a = State MikuState a
type MikuMonad    = MikuMonadT () -- (Identity ())