# Pastebin Zui39kYI {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module Servant.ActiveResource where import Data.Kind (Type) import Servant.API import Servant.API.Generic import Servant.Server.Generic import Servant.Server.UVerb class Monad (ResourceMonad id) => Resource id where type StoredResourceData id :: Type type ResourceMonad id :: Type -> Type listResource :: ResourceMonad id [StoredResourceData id] serveResourceT :: forall id. Resource id => ResourceRoutes id (AsServerT (ResourceMonad id)) serveResourceT = ResourceRoutes { listRoute = listResource @id >>= respond . WithStatus @200 } data ResourceRoutes id route = ResourceRoutes { listRoute :: route :- UVerb 'GET '[JSON] '[WithStatus 200 [StoredResourceData id]] } deriving (Generic)