{-# 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 {forall k (a :: k). Name a -> Text
nameText :: Text}
  deriving (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
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, 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
Ord, 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 :: forall {k} {k} (a :: k) (b :: k). Name a -> Name b
uncheckedCast (Name Text
s) = forall k (a :: k). Text -> Name a
Name Text
s

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

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

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

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

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

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

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

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

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