src/Distribution/Parsec/Position.hs

    {-# LANGUAGE DeriveGeneric #-}
    module Distribution.Parsec.Position (
        Position (..),
        incPos,
        retPos,
        showPos,
        zeroPos,
        positionCol,
        positionRow,
        ) where

    import Distribution.Compat.Prelude
    import Prelude ()

    -- | 1-indexed row and column positions in a file.
    data Position = Position
        {-# UNPACK #-}  !Int           -- row
        {-# UNPACK #-}  !Int           -- column
      deriving (Eq, Ord, Show, Generic)

    instance Binary Position
    instance NFData Position where rnf = genericRnf

    -- | Shift position by n columns to the right.
    incPos :: Int -> Position -> Position
    incPos n (Position row col) = Position row (col + n)

    -- | Shift position to beginning of next row.
    retPos :: Position -> Position
    retPos (Position row _col) = Position (row + 1) 1

    showPos :: Position -> String
    showPos (Position row col) = show row ++ ":" ++ show col

    zeroPos :: Position
    zeroPos = Position 0 0

    -- | @since 3.0.0.0
    positionCol :: Position -> Int
    positionCol (Position _ c) = c

    -- | @since 3.0.0.0
    positionRow :: Position -> Int
    positionRow (Position r _) = r