    {-# LANGUAGE DataKinds          #-}
    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE PolyKinds          #-}
    {-# OPTIONS_HADDOCK not-home    #-}
    module Servant.API.Capture (Capture, Capture', CaptureAll) where

    import           Data.Kind
                     (Type)
    import           Data.Typeable
                     (Typeable)
    import           GHC.TypeLits
                     (Symbol)
    -- | Capture a value from the request path under a certain type @a@.
    --
    -- Example:
    --
    -- >>>            -- GET /books/:isbn
    -- >>> type MyApi = "books" :> Capture "isbn" Text :> Get '[JSON] Book
    type Capture = Capture' '[] -- todo

    -- | 'Capture' which can be modified. For example with 'Description'.
    data Capture' (mods :: [Type]) (sym :: Symbol) (a :: Type)
        deriving (Typeable)

    -- | Capture all remaining values from the request path under a certain type
    -- @a@.
    --
    -- Example:
    --
    -- >>>            -- GET /src/*
    -- >>> type MyAPI = "src" :> CaptureAll "segments" Text :> Get '[JSON] SourceFile
    data CaptureAll (sym :: Symbol) (a :: Type)
        deriving (Typeable)

    -- $setup
    -- >>> import Servant.API
    -- >>> import Data.Aeson
    -- >>> import Data.Text
    -- >>> data Book
    -- >>> instance ToJSON Book where { toJSON = undefined }
    -- >>> data SourceFile
    -- >>> instance ToJSON SourceFile where { toJSON = undefined }