{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses  #-}
{-# LANGUAGE RankNTypes             #-}
{-# LANGUAGE TypeOperators          #-}

module Web.Eved.Internal
    where

import           Data.List.NonEmpty   (NonEmpty)
import           Data.Text            (Text)
import           Network.HTTP.Types   (Status, StdMethod (..), status200)
import           Web.Eved.ContentType (ContentType)
import           Web.Eved.Header      (Header)
import           Web.Eved.QueryParam  (QueryParam)
import           Web.Eved.UrlElement  (UrlElement)

data (:<|>) a b = a :<|> b
infixl 4 :<|>

class Eved api m | api -> m where
    (.<|>) :: api a -> api b -> api (a :<|> b)

    lit :: Text -> api a -> api a
    capture :: Text -> UrlElement a -> api b -> api (a -> b)
    reqBody :: NonEmpty (ContentType a) -> api b -> api (a -> b)
    queryParam :: Text -> QueryParam a -> api b -> api (a -> b)
    header :: Text -> Header a -> api b -> api (a -> b)
    verb :: StdMethod -> Status -> NonEmpty (ContentType a) -> api (m a)