{-# LANGUAGE TypeFamilies #-}
module DDC.Data.SourcePos
        (SourcePos (..))
where
import DDC.Base.Pretty
import Control.DeepSeq

-- | A position in a source file.        
--
--   If there is no file path then we assume that the input has been read
--   from an interactive session and display ''<interactive>'' when pretty printing.
data SourcePos 
        = SourcePos
        { sourcePosSource       :: String
        , sourcePosLine         :: Int
        , sourcePosColumn       :: Int }
        deriving (Eq, Show)


instance NFData SourcePos where
 rnf (SourcePos str l c)
  = rnf str `seq` rnf l `seq` rnf c


instance Pretty SourcePos where
 -- Suppress printing of line and column number when they are both zero.
 -- File line numbers officially start from 1, so having 0 0 probably
 -- means this isn't real information.
 ppr (SourcePos source 0 0)
        = text $ source

 ppr (SourcePos source l c)     
        = text $ source ++ ":" ++ show l ++ ":" ++ show c