{-# LANGUAGE DeriveAnyClass #-}

module Blanks.Name
  ( Name (..)
  , NameOnly
  , pattern NameOnly
  ) where

import Control.DeepSeq (NFData)
import GHC.Generics (Generic)

-- | 'Name' is compared on value only, allowing you to define and use
-- things like 'NameOnly' in your 'BlankInfo' values to make alpha-equivalent
-- terms structurally ('Eq') equivalent.
data Name n a =
  Name
    { Name n a -> n
nameKey :: !n
    , Name n a -> a
nameValue :: !a
    }
  deriving stock (Int -> Name n a -> ShowS
[Name n a] -> ShowS
Name n a -> String
(Int -> Name n a -> ShowS)
-> (Name n a -> String) -> ([Name n a] -> ShowS) -> Show (Name n a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall n a. (Show n, Show a) => Int -> Name n a -> ShowS
forall n a. (Show n, Show a) => [Name n a] -> ShowS
forall n a. (Show n, Show a) => Name n a -> String
showList :: [Name n a] -> ShowS
$cshowList :: forall n a. (Show n, Show a) => [Name n a] -> ShowS
show :: Name n a -> String
$cshow :: forall n a. (Show n, Show a) => Name n a -> String
showsPrec :: Int -> Name n a -> ShowS
$cshowsPrec :: forall n a. (Show n, Show a) => Int -> Name n a -> ShowS
Show, a -> Name n b -> Name n a
(a -> b) -> Name n a -> Name n b
(forall a b. (a -> b) -> Name n a -> Name n b)
-> (forall a b. a -> Name n b -> Name n a) -> Functor (Name n)
forall a b. a -> Name n b -> Name n a
forall a b. (a -> b) -> Name n a -> Name n b
forall n a b. a -> Name n b -> Name n a
forall n a b. (a -> b) -> Name n a -> Name n b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Name n b -> Name n a
$c<$ :: forall n a b. a -> Name n b -> Name n a
fmap :: (a -> b) -> Name n a -> Name n b
$cfmap :: forall n a b. (a -> b) -> Name n a -> Name n b
Functor, Name n a -> Bool
(a -> m) -> Name n a -> m
(a -> b -> b) -> b -> Name n a -> b
(forall m. Monoid m => Name n m -> m)
-> (forall m a. Monoid m => (a -> m) -> Name n a -> m)
-> (forall m a. Monoid m => (a -> m) -> Name n a -> m)
-> (forall a b. (a -> b -> b) -> b -> Name n a -> b)
-> (forall a b. (a -> b -> b) -> b -> Name n a -> b)
-> (forall b a. (b -> a -> b) -> b -> Name n a -> b)
-> (forall b a. (b -> a -> b) -> b -> Name n a -> b)
-> (forall a. (a -> a -> a) -> Name n a -> a)
-> (forall a. (a -> a -> a) -> Name n a -> a)
-> (forall a. Name n a -> [a])
-> (forall a. Name n a -> Bool)
-> (forall a. Name n a -> Int)
-> (forall a. Eq a => a -> Name n a -> Bool)
-> (forall a. Ord a => Name n a -> a)
-> (forall a. Ord a => Name n a -> a)
-> (forall a. Num a => Name n a -> a)
-> (forall a. Num a => Name n a -> a)
-> Foldable (Name n)
forall a. Eq a => a -> Name n a -> Bool
forall a. Num a => Name n a -> a
forall a. Ord a => Name n a -> a
forall m. Monoid m => Name n m -> m
forall a. Name n a -> Bool
forall a. Name n a -> Int
forall a. Name n a -> [a]
forall a. (a -> a -> a) -> Name n a -> a
forall n a. Eq a => a -> Name n a -> Bool
forall n a. Num a => Name n a -> a
forall n a. Ord a => Name n a -> a
forall m a. Monoid m => (a -> m) -> Name n a -> m
forall n m. Monoid m => Name n m -> m
forall n a. Name n a -> Bool
forall n a. Name n a -> Int
forall n a. Name n a -> [a]
forall b a. (b -> a -> b) -> b -> Name n a -> b
forall a b. (a -> b -> b) -> b -> Name n a -> b
forall n a. (a -> a -> a) -> Name n a -> a
forall n m a. Monoid m => (a -> m) -> Name n a -> m
forall n b a. (b -> a -> b) -> b -> Name n a -> b
forall n a b. (a -> b -> b) -> b -> Name n a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: Name n a -> a
$cproduct :: forall n a. Num a => Name n a -> a
sum :: Name n a -> a
$csum :: forall n a. Num a => Name n a -> a
minimum :: Name n a -> a
$cminimum :: forall n a. Ord a => Name n a -> a
maximum :: Name n a -> a
$cmaximum :: forall n a. Ord a => Name n a -> a
elem :: a -> Name n a -> Bool
$celem :: forall n a. Eq a => a -> Name n a -> Bool
length :: Name n a -> Int
$clength :: forall n a. Name n a -> Int
null :: Name n a -> Bool
$cnull :: forall n a. Name n a -> Bool
toList :: Name n a -> [a]
$ctoList :: forall n a. Name n a -> [a]
foldl1 :: (a -> a -> a) -> Name n a -> a
$cfoldl1 :: forall n a. (a -> a -> a) -> Name n a -> a
foldr1 :: (a -> a -> a) -> Name n a -> a
$cfoldr1 :: forall n a. (a -> a -> a) -> Name n a -> a
foldl' :: (b -> a -> b) -> b -> Name n a -> b
$cfoldl' :: forall n b a. (b -> a -> b) -> b -> Name n a -> b
foldl :: (b -> a -> b) -> b -> Name n a -> b
$cfoldl :: forall n b a. (b -> a -> b) -> b -> Name n a -> b
foldr' :: (a -> b -> b) -> b -> Name n a -> b
$cfoldr' :: forall n a b. (a -> b -> b) -> b -> Name n a -> b
foldr :: (a -> b -> b) -> b -> Name n a -> b
$cfoldr :: forall n a b. (a -> b -> b) -> b -> Name n a -> b
foldMap' :: (a -> m) -> Name n a -> m
$cfoldMap' :: forall n m a. Monoid m => (a -> m) -> Name n a -> m
foldMap :: (a -> m) -> Name n a -> m
$cfoldMap :: forall n m a. Monoid m => (a -> m) -> Name n a -> m
fold :: Name n m -> m
$cfold :: forall n m. Monoid m => Name n m -> m
Foldable, Functor (Name n)
Foldable (Name n)
(Functor (Name n), Foldable (Name n)) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> Name n a -> f (Name n b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    Name n (f a) -> f (Name n a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> Name n a -> m (Name n b))
-> (forall (m :: * -> *) a.
    Monad m =>
    Name n (m a) -> m (Name n a))
-> Traversable (Name n)
(a -> f b) -> Name n a -> f (Name n b)
forall n. Functor (Name n)
forall n. Foldable (Name n)
forall n (m :: * -> *) a. Monad m => Name n (m a) -> m (Name n a)
forall n (f :: * -> *) a.
Applicative f =>
Name n (f a) -> f (Name n a)
forall n (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Name n a -> m (Name n b)
forall n (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Name n a -> f (Name n b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Name n (m a) -> m (Name n a)
forall (f :: * -> *) a.
Applicative f =>
Name n (f a) -> f (Name n a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Name n a -> m (Name n b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Name n a -> f (Name n b)
sequence :: Name n (m a) -> m (Name n a)
$csequence :: forall n (m :: * -> *) a. Monad m => Name n (m a) -> m (Name n a)
mapM :: (a -> m b) -> Name n a -> m (Name n b)
$cmapM :: forall n (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Name n a -> m (Name n b)
sequenceA :: Name n (f a) -> f (Name n a)
$csequenceA :: forall n (f :: * -> *) a.
Applicative f =>
Name n (f a) -> f (Name n a)
traverse :: (a -> f b) -> Name n a -> f (Name n b)
$ctraverse :: forall n (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Name n a -> f (Name n b)
$cp2Traversable :: forall n. Foldable (Name n)
$cp1Traversable :: forall n. Functor (Name n)
Traversable, (forall x. Name n a -> Rep (Name n a) x)
-> (forall x. Rep (Name n a) x -> Name n a) -> Generic (Name n a)
forall x. Rep (Name n a) x -> Name n a
forall x. Name n a -> Rep (Name n a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall n a x. Rep (Name n a) x -> Name n a
forall n a x. Name n a -> Rep (Name n a) x
$cto :: forall n a x. Rep (Name n a) x -> Name n a
$cfrom :: forall n a x. Name n a -> Rep (Name n a) x
Generic)
  deriving anyclass (Name n a -> ()
(Name n a -> ()) -> NFData (Name n a)
forall a. (a -> ()) -> NFData a
forall n a. (NFData n, NFData a) => Name n a -> ()
rnf :: Name n a -> ()
$crnf :: forall n a. (NFData n, NFData a) => Name n a -> ()
NFData)

instance Eq a => Eq (Name n a) where
  Name _ x :: a
x == :: Name n a -> Name n a -> Bool
== Name _ y :: a
y = a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y

-- An erased 'Name'.
type NameOnly n = Name n ()

pattern NameOnly :: n -> NameOnly n
pattern $bNameOnly :: n -> NameOnly n
$mNameOnly :: forall r n. NameOnly n -> (n -> r) -> (Void# -> r) -> r
NameOnly n = Name n ()

{-# COMPLETE NameOnly #-}