{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE PolyKinds #-}

module Hercules.API.Name
  ( Name (..),
    uncheckedCast,
  )
where

import Control.DeepSeq (NFData)
import Data.Aeson
import Data.Hashable (Hashable (..))
import Data.Proxy
import Data.Swagger
  ( ToParamSchema (..),
    ToSchema (..),
  )
import Data.Text (Text)
import GHC.Generics (Generic)
import Web.HttpApiData
import Prelude

-- | A slug. Display names are simply 'Text'.
newtype Name (a :: k) = Name {Name a -> Text
nameText :: Text}
  deriving ((forall x. Name a -> Rep (Name a) x)
-> (forall x. Rep (Name a) x -> Name a) -> Generic (Name a)
forall x. Rep (Name a) x -> Name a
forall x. Name a -> Rep (Name a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k (a :: k) x. Rep (Name a) x -> Name a
forall k (a :: k) x. Name a -> Rep (Name a) x
$cto :: forall k (a :: k) x. Rep (Name a) x -> Name a
$cfrom :: forall k (a :: k) x. Name a -> Rep (Name a) x
Generic, Name a -> Name a -> Bool
(Name a -> Name a -> Bool)
-> (Name a -> Name a -> Bool) -> Eq (Name a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k (a :: k). Name a -> Name a -> Bool
/= :: Name a -> Name a -> Bool
$c/= :: forall k (a :: k). Name a -> Name a -> Bool
== :: Name a -> Name a -> Bool
$c== :: forall k (a :: k). Name a -> Name a -> Bool
Eq, Eq (Name a)
Eq (Name a)
-> (Name a -> Name a -> Ordering)
-> (Name a -> Name a -> Bool)
-> (Name a -> Name a -> Bool)
-> (Name a -> Name a -> Bool)
-> (Name a -> Name a -> Bool)
-> (Name a -> Name a -> Name a)
-> (Name a -> Name a -> Name a)
-> Ord (Name a)
Name a -> Name a -> Bool
Name a -> Name a -> Ordering
Name a -> Name a -> Name a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k (a :: k). Eq (Name a)
forall k (a :: k). Name a -> Name a -> Bool
forall k (a :: k). Name a -> Name a -> Ordering
forall k (a :: k). Name a -> Name a -> Name a
min :: Name a -> Name a -> Name a
$cmin :: forall k (a :: k). Name a -> Name a -> Name a
max :: Name a -> Name a -> Name a
$cmax :: forall k (a :: k). Name a -> Name a -> Name a
>= :: Name a -> Name a -> Bool
$c>= :: forall k (a :: k). Name a -> Name a -> Bool
> :: Name a -> Name a -> Bool
$c> :: forall k (a :: k). Name a -> Name a -> Bool
<= :: Name a -> Name a -> Bool
$c<= :: forall k (a :: k). Name a -> Name a -> Bool
< :: Name a -> Name a -> Bool
$c< :: forall k (a :: k). Name a -> Name a -> Bool
compare :: Name a -> Name a -> Ordering
$ccompare :: forall k (a :: k). Name a -> Name a -> Ordering
$cp1Ord :: forall k (a :: k). Eq (Name a)
Ord, Name a -> ()
(Name a -> ()) -> NFData (Name a)
forall a. (a -> ()) -> NFData a
forall k (a :: k). Name a -> ()
rnf :: Name a -> ()
$crnf :: forall k (a :: k). Name a -> ()
NFData)

instance Hashable (Name a)

uncheckedCast :: Name a -> Name b
uncheckedCast :: Name a -> Name b
uncheckedCast (Name Text
s) = Text -> Name b
forall k (a :: k). Text -> Name a
Name Text
s

instance Show (Name a) where
  showsPrec :: Int -> Name a -> ShowS
showsPrec Int
n = Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
n (Text -> ShowS) -> (Name a -> Text) -> Name a -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> Text
forall k (a :: k). Name a -> Text
nameText

instance ToJSON (Name a) where
  toEncoding :: Name a -> Encoding
toEncoding = Text -> Encoding
forall a. ToJSON a => a -> Encoding
toEncoding (Text -> Encoding) -> (Name a -> Text) -> Name a -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> Text
forall k (a :: k). Name a -> Text
nameText

  toJSON :: Name a -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> (Name a -> Text) -> Name a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name a -> Text
forall k (a :: k). Name a -> Text
nameText

instance FromJSON (Name a) where
  parseJSON :: Value -> Parser (Name a)
parseJSON = (Text -> Name a) -> Parser Text -> Parser (Name a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Name a
forall k (a :: k). Text -> Name a
Name (Parser Text -> Parser (Name a))
-> (Value -> Parser Text) -> Value -> Parser (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser Text
forall a. FromJSON a => Value -> Parser a
parseJSON

instance ToHttpApiData (Name a) where
  toUrlPiece :: Name a -> Text
toUrlPiece = Name a -> Text
forall k (a :: k). Name a -> Text
nameText

instance FromHttpApiData (Name a) where
  parseUrlPiece :: Text -> Either Text (Name a)
parseUrlPiece = (Text -> Name a) -> Either Text Text -> Either Text (Name a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Name a
forall k (a :: k). Text -> Name a
Name (Either Text Text -> Either Text (Name a))
-> (Text -> Either Text Text) -> Text -> Either Text (Name a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either Text Text
forall a. FromHttpApiData a => Text -> Either Text a
parseUrlPiece

instance ToSchema (Name a) where
  declareNamedSchema :: Proxy (Name a) -> Declare (Definitions Schema) NamedSchema
declareNamedSchema = Proxy Text -> Declare (Definitions Schema) NamedSchema
forall a.
ToSchema a =>
Proxy a -> Declare (Definitions Schema) NamedSchema
declareNamedSchema (Proxy Text -> Declare (Definitions Schema) NamedSchema)
-> (Proxy (Name a) -> Proxy Text)
-> Proxy (Name a)
-> Declare (Definitions Schema) NamedSchema
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name a -> Text) -> Proxy (Name a) -> Proxy Text
forall a b (proxy :: * -> *). (a -> b) -> proxy a -> Proxy b
invmap Name a -> Text
forall k (a :: k). Name a -> Text
nameText

instance ToParamSchema (Name a) where
  toParamSchema :: Proxy (Name a) -> ParamSchema t
toParamSchema = Proxy Text -> ParamSchema t
forall a (t :: SwaggerKind *).
ToParamSchema a =>
Proxy a -> ParamSchema t
toParamSchema (Proxy Text -> ParamSchema t)
-> (Proxy (Name a) -> Proxy Text)
-> Proxy (Name a)
-> ParamSchema t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name a -> Text) -> Proxy (Name a) -> Proxy Text
forall a b (proxy :: * -> *). (a -> b) -> proxy a -> Proxy b
invmap Name a -> Text
forall k (a :: k). Name a -> Text
nameText

invmap :: (a -> b) -> proxy a -> Proxy b
invmap :: (a -> b) -> proxy a -> Proxy b
invmap a -> b
_ proxy a
_ = Proxy b
forall k (t :: k). Proxy t
Proxy