module Language.Paraiso.Name
(
Name(..), Named(..),
Nameable(..), namee
) where
import Control.Monad
newtype Name = Name String deriving (Eq, Ord, Show, Read)
class Nameable a where
name :: a -> Name
nameStr :: a -> String
nameStr = (\(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)