module Language.Paraiso.Name
(
Name, Named(..), mkName,
Nameable(..), namee
) where
import Control.Monad
import Data.Text (Text, unpack)
newtype Name = Name Text deriving (Eq, Ord, Show, Read)
mkName :: Text -> Name
mkName x = Name x
class Nameable a where
name :: a -> Name
nameText :: a -> Text
nameText = (\(Name str) -> str) . name
nameStr :: a -> String
nameStr = unpack . (\(Name str) -> str) . name
instance Nameable Name where
name = id
data Named a = Named Name a
instance Nameable (Named a) where
name (Named n _) = n
instance Functor Named where
fmap f (Named n a) = Named n $ f a
namee :: Named a -> a
namee (Named _ x) = x
deriving instance (Eq a) => Eq (Named a)
deriving instance (Ord a) => Ord (Named a)
deriving instance (Show a) => Show (Named a)
deriving instance (Read a) => Read (Named a)