{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_HADDOCK not-home #-}
module Servant.API.Routes.Internal.Request
( Request (..)
, unRequest
, AllTypeable (..)
)
where
import Data.Aeson
import Data.Function (on)
import Data.Kind (Type)
import Data.List (nub, sort)
import Data.Typeable
import Lens.Micro.TH
import "this" Servant.API.Routes.Internal.Some as S
import "this" Servant.API.Routes.Utils
newtype Request = Request {Request -> Some TypeRep
_unRequest :: Some TypeRep}
deriving (Int -> Request -> ShowS
[Request] -> ShowS
Request -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Request] -> ShowS
$cshowList :: [Request] -> ShowS
show :: Request -> String
$cshow :: Request -> String
showsPrec :: Int -> Request -> ShowS
$cshowsPrec :: Int -> Request -> ShowS
Show) via Some TypeRep
makeLenses ''Request
instance ToJSON Request where
toJSON :: Request -> Value
toJSON = forall a. (a -> Value) -> Text -> Some a -> Value
someToJSONAs TypeRep -> Value
typeRepToJSON Text
"all_of" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Some TypeRep
_unRequest
instance Eq Request where
== :: Request -> Request -> Bool
(==) = forall a. Eq a => ([a] -> [a] -> Bool) -> Some a -> Some a -> Bool
eqSome (forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Ord a => [a] -> [a]
sort forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Eq a => [a] -> [a]
nub)) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Request -> Some TypeRep
_unRequest
instance Semigroup Request where
Request Some TypeRep
b1 <> :: Request -> Request -> Request
<> Request Some TypeRep
b2 = Some TypeRep -> Request
Request (forall a.
(a -> [a] -> [a])
-> ([a] -> a -> [a]) -> Some a -> Some a -> Some a
appendSome (:) (forall a b c. (a -> b -> c) -> b -> a -> c
flip (:)) Some TypeRep
b1 Some TypeRep
b2)
instance Monoid Request where
mempty :: Request
mempty = Some TypeRep -> Request
Request forall a. Some a
S.None
class AllTypeable (as :: [Type]) where
typeReps :: [TypeRep]
instance (Typeable a, Typeable b) => AllTypeable '[a, b] where
typeReps :: [TypeRep]
typeReps = [forall a. Typeable a => TypeRep
typeRepOf @a, forall a. Typeable a => TypeRep
typeRepOf @b]
instance (Typeable a, AllTypeable (b ': c ': as)) => AllTypeable (a ': b ': c ': as) where
typeReps :: [TypeRep]
typeReps = forall a. Typeable a => TypeRep
typeRepOf @a forall a. a -> [a] -> [a]
: forall (as :: [*]). AllTypeable as => [TypeRep]
typeReps @(b ': c ': as)