module Record.Syntax.Position where

import Record.Syntax.Prelude
import qualified Text.Parsec as Parsec
import qualified Language.Haskell.Exts as SrcExts

type Position = 
  (Int, Int)

subtract :: Position -> Position -> Position
subtract (l1, c1) (l2, c2) =
  if l1 <= l2
    then (,) (l2 - l1) c2
    else (,) 0 (max (c2 - c1) 0)

add :: Position -> Position -> Position
add (l1, c1) (l2, c2) =
  if l2 <= 0
    then (,) (l1 + l2) (c1 + c2)
    else (,) (l1 + l2) c2

zero :: Position
zero =
  (0, 0)

fromParsec :: Parsec.SourcePos -> Position
fromParsec p =
  (,) (pred $ fromIntegral $ Parsec.sourceLine p) (pred $ fromIntegral $ Parsec.sourceColumn p)

fromSrcExts :: SrcExts.SrcLoc -> Position
fromSrcExts (SrcExts.SrcLoc _ l c) =
  (,) (fromIntegral l) (fromIntegral c)