{-# LANGUAGE
CPP
, FlexibleContexts
, FlexibleInstances
, GADTs
, KindSignatures
, MultiParamTypeClasses
, NamedFieldPuns
, NoImplicitPrelude
, RankNTypes
, TypeSynonymInstances
#-}
#if MIN_VERSION_base(4,9,0)
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
#endif
module Rest.Resource
( Resource (..)
, mkResource
, mkResourceId
, mkResourceReader
, mkResourceReaderWith
, module Rest.Types.Void
) where
import Prelude.Compat
import Control.Monad.Reader
import Rest.Handler
import Rest.Schema (Schema (..), Step (..))
import Rest.Types.Void
data Resource m s sid mid aid where
Resource :: (Applicative m, Monad m, Applicative s, Monad s) =>
{ name :: String
, description :: String
, schema :: Schema sid mid aid
, private :: Bool
, enter :: forall b. sid -> s b -> m b
, list :: mid -> ListHandler m
, statics :: aid -> Handler m
, get :: Maybe (Handler s)
, update :: Maybe (Handler s)
, remove :: Maybe (Handler s)
, create :: Maybe (Handler m)
, actions :: [(String, Handler s)]
, selects :: [(String, Handler s)]
} -> Resource m s sid mid aid
mkResource :: (Applicative m, Monad m, Applicative s, Monad s) => (forall b. sid -> s b -> m b) -> Resource m s sid Void Void
mkResource e = Resource
{ name = ""
, description = ""
, schema = Schema Nothing (Named [])
, private = False
, enter = e
, list = magic
, statics = magic
, get = Nothing
, update = Nothing
, remove = Nothing
, create = Nothing
, actions = []
, selects = []
}
mkResourceId :: (Applicative m, Monad m) => Resource m m sid Void Void
mkResourceId = mkResource (const id)
mkResourceReader :: (Applicative m, Monad m) => Resource m (ReaderT sid m) sid Void Void
mkResourceReader = mkResourceReaderWith id
mkResourceReaderWith :: (Applicative m, Monad m, Applicative s, Monad s) => (forall b. s b -> ReaderT sid m b) -> Resource m s sid Void Void
mkResourceReaderWith f = mkResource (\a -> flip runReaderT a . f)