{-# OPTIONS_GHC -Wall #-} module Parser.Reporting ( Located(..) , Position(..) , Region(..) , traverse , toValue , merge , at , toRegion , mergeRegions , zero , one ) where import Prelude hiding (traverse) import Control.Monad (liftM2) import Data.Binary (Binary, get, put) import Data.Word (Word16) -- LOCATED data Located a = At Region a -- TODO see if unpacking region is helpful instance Functor Located where fmap f (At region a) = At region (f a) traverse :: (Functor f) => (a -> f b) -> Located a -> f (Located b) traverse func (At region value) = At region <$> func value toValue :: Located a -> a toValue (At _ value) = value merge :: Located a -> Located b -> value -> Located value merge (At r1 _) (At r2 _) value = At (mergeRegions r1 r2) value -- POSITION data Position = Position {-# UNPACK #-} !Word16 {-# UNPACK #-} !Word16 deriving (Eq) at :: Position -> Position -> a -> Located a at start end a = At (Region start end) a -- REGION data Region = Region Position Position deriving (Eq) toRegion :: Located a -> Region toRegion (At region _) = region mergeRegions :: Region -> Region -> Region mergeRegions (Region start _) (Region _ end) = Region start end zero :: Region zero = Region (Position 0 0) (Position 0 0) one :: Region one = Region (Position 1 1) (Position 1 1) instance Binary Region where put (Region a b) = put a >> put b get = liftM2 Region get get instance Binary Position where put (Position a b) = put a >> put b get = liftM2 Position get get