module CS.JsonDotNet.Base where
import Control.Monad.Trans
import Control.Monad.Identity
import Data.Proxy
import Data.Swagger hiding (namespace)
import Servant.Swagger
type Swag = SwagT Identity
runSwagger :: Swag a -> Swagger -> a
runSwagger f = runIdentity . runSwagT f
mkSwag :: Monad m => (Swagger -> a) -> SwagT m a
mkSwag f = SwagT (return . f)
generateFrom :: HasSwagger api => Swag a -> Proxy api -> a
f `generateFrom` api = runSwagger f (toSwagger api)
newtype SwagT m a = SwagT { runSwagT :: Swagger -> m a }
instance Monad m => Functor (SwagT m) where
fmap f x = SwagT $ \sw -> return . f =<< runSwagT x sw
instance Monad m => Applicative (SwagT m) where
pure x = SwagT $ \sw -> return x
f <*> g = SwagT $ \sw -> do
f' <- runSwagT f sw
g' <- runSwagT g sw
return (f' g')
instance Monad m => Monad (SwagT m) where
f >>= k = SwagT $ \sw ->
runSwagT f sw >>= \f' ->
runSwagT (k f') sw
instance Monad m => Monoid (SwagT m [a]) where
mempty = SwagT $ \sw -> return mempty
x `mappend` y = SwagT $ \sw -> do
x' <- runSwagT x sw
y' <- runSwagT y sw
return $ x' `mappend` y'
instance MonadTrans SwagT where
lift m = SwagT $ \sw -> m
instance MonadIO m => MonadIO (SwagT m) where
liftIO x = SwagT $ \sw -> liftIO x