{-# LANGUAGE DeriveFoldable #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveTraversable #-} module Zinza.Pos where -- | Location, line and column. data Loc = Loc !Int !Int deriving (Eq, Show) -- | /Unknown/ location. zeroLoc :: Loc zeroLoc = Loc 0 0 -- | Pretty-print location. displayLoc :: Loc -> String displayLoc (Loc l c) = show l ++ ":" ++ show c -- | Located element. data Located a = L {-# UNPACK #-} !Loc a deriving (Eq, Show, Functor, Foldable, Traversable) -- | Some containers have location for each element. class Traversable t => TraversableWithLoc t where traverseWithLoc :: Applicative f => (Loc -> a -> f b) -> t a -> f (t b)