module CCO.SourcePos (
    
    Source (File, Stdin)     
  , Pos (Pos, EOF)           
  , SourcePos (SourcePos)    
) where
import CCO.Tree.ATerm       (ATerm (App))
import CCO.Tree.Base        (Tree (fromTree, toTree))
import CCO.Tree.Instances   ()
import CCO.Tree.Parser      (parseTree, app, arg)
import Control.Applicative  (Applicative (pure, (<*>)), (<$>))
data Source = File FilePath    
            | Stdin            
            deriving (Eq, Show, Read)
instance Tree Source where
  fromTree (File filePath) = App "File" [fromTree filePath]
  fromTree Stdin           = App "Stdin" []
  toTree = parseTree [app "File" (File <$> arg), app "Stdin" (pure Stdin)]
data Pos = Pos !Int !Int    
                            
         | EOF              
         deriving (Eq, Show, Read)
instance Tree Pos where
  fromTree (Pos line column) = App "Pos" [fromTree line, fromTree column]
  fromTree EOF               = App "EOF" []
  toTree = parseTree [app "Pos" (Pos <$> arg <*> arg), app "EOF" (pure EOF)]
data SourcePos = SourcePos Source Pos    
               deriving (Eq, Show, Read)
instance Tree SourcePos where
  fromTree (SourcePos src pos) = App "SourcePos" [fromTree src, fromTree pos]
  toTree = parseTree [app "SourcePos" (SourcePos <$> arg <*> arg)]