Skip to content

Instantly share code, notes, and snippets.

@mklinik
Created December 8, 2021 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mklinik/84499fb28c3d5e6122da58d1ed13d749 to your computer and use it in GitHub Desktop.
Save mklinik/84499fb28c3d5e6122da58d1ed13d749 to your computer and use it in GitHub Desktop.
Minimal example for the servant-pagination Next-Range issue
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Data.Aeson (ToJSON)
import GHC.Generics (Generic)
import qualified Data.Aeson as Aeson
import Data.Maybe (fromMaybe)
import Data.Proxy (Proxy (..))
import Servant
import Servant.Pagination
import qualified Network.Wai.Handler.Warp as Warp
data Color = Color
{ name :: String
, rgb :: [Int]
, hex :: String
} deriving (Eq, Show, Generic)
instance ToJSON Color where
toJSON =
Aeson.genericToJSON Aeson.defaultOptions
colors :: [Color]
colors =
[ Color "Aqua" [0, 255, 255] "#00ffff"
, Color "Black" [0, 0, 0] "#000000"
, Color "Blue" [0, 0, 255] "#0000ff"
]
instance HasPagination Color "name" where
type RangeType Color "name" = String
getFieldValue _ = name
type API =
"colors"
:> Header "Range" (Ranges '["name"] Color)
:> GetPartialContent '[JSON] (Headers (PageHeaders '["name"] Color) [Color])
defaultRange :: Range "name" String
defaultRange =
getDefaultRange (Proxy @Color)
server :: Server API
server mrange = do
let range =
fromMaybe defaultRange (mrange >>= extractRange)
returnRange range (applyRange range colors)
main :: IO ()
main =
Warp.run 1337 (serve (Proxy :: Proxy API) server)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment