module Language.Paraiso.Name
(
Nameable(..),
Name, mkName, isNameOf,
Named(..), 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
isNameOf :: Text -> a -> Named a
isNameOf n a = Named (mkName n) 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)
instance (Ord a) => Ord (Named a) where
(Named n a) `compare` (Named m b) = (a,n) `compare` (b,m)
deriving instance (Show a) => Show (Named a)
deriving instance (Read a) => Read (Named a)