module Data.Geo.Route.Name( Name , HasName(..) , HasMaybeName(..) , nameIso , (<.>) ) where import Prelude(Show) import Data.Eq(Eq) import Data.Function(id) import Data.Ord(Ord) import Data.List((++)) import Data.Maybe(Maybe) import Data.String(String, IsString(..)) import Control.Lens(Lens', Iso', iso, (?~)) import Data.Geo.Route.Gpx(Gpx(gpx)) newtype Name = Name String deriving (Eq, Ord, Show) nameIso :: Iso' String Name nameIso = iso Name (\(Name s) -> s) class HasName t where name :: Lens' t Name instance HasName Name where name = id class HasMaybeName t where mname :: Lens' t (Maybe Name) instance IsString Name where fromString = Name instance Gpx Name where gpx (Name n) = "<name>" ++ n ++ "</name>" (<.>) :: HasMaybeName t => Name -> t -> t (<.>) = (?~) mname infixr 5 <.>