{-# 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           Hack2
import           Hack2.Contrib.Utils

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


data MikuState = MikuState
  {
    _middlewares :: [Middleware]
  , _router      :: [Middleware]
  , _mimes       :: [(ByteString, ByteString)]
  }

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

makeLenses ''MikuState

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