{-# LANGUAGE Rank2Types #-}
module Text.PariPari.Lens (
  posLine
  , posCol
  , reportLine
  , reportCol
  , reportFile
  , reportErrors
  , ecErrors
  , ecContext
  , optMaxContexts
  , optMaxErrorsPerContext
  , optMaxLabelsPerContext
) where

import Text.PariPari.Internal.Class
import Text.PariPari.Internal.Reporter

type Lens a b = forall f . Functor f => (b -> f b) -> (a -> f a)

posLine :: Lens Pos Int
posLine k p = fmap (\x -> p { _posLine = x }) (k (_posLine p))
{-# INLINE posLine #-}

posCol :: Lens Pos Int
posCol k p = fmap (\x -> p { _posCol = x }) (k (_posCol p))
{-# INLINE posCol #-}

reportLine :: Lens Report Int
reportLine k r = fmap (\x -> r { _reportLine = x }) (k (_reportLine r))
{-# INLINE reportLine #-}

reportCol :: Lens Report Int
reportCol k r = fmap (\x -> r { _reportCol = x }) (k (_reportCol r))
{-# INLINE reportCol #-}

reportFile :: Lens Report FilePath
reportFile k r = fmap (\x -> r { _reportFile = x }) (k (_reportFile r))
{-# INLINE reportFile #-}

reportErrors :: Lens Report [ErrorContext]
reportErrors k r = fmap (\x -> r { _reportErrors = x }) (k (_reportErrors r))
{-# INLINE reportErrors #-}

ecErrors :: Lens ErrorContext [Error]
ecErrors k e = fmap (\x -> e { _ecErrors = x }) (k (_ecErrors e))
{-# INLINE ecErrors #-}

ecContext :: Lens ErrorContext [String]
ecContext k e = fmap (\x -> e { _ecContext = x }) (k (_ecContext e))
{-# INLINE ecContext #-}

optMaxContexts :: Lens ReportOptions Int
optMaxContexts k o = fmap (\x -> o { _optMaxContexts = x }) (k (_optMaxContexts o))
{-# INLINE optMaxContexts #-}

optMaxErrorsPerContext :: Lens ReportOptions Int
optMaxErrorsPerContext k o = fmap (\x -> o { _optMaxErrorsPerContext = x }) (k (_optMaxErrorsPerContext o))
{-# INLINE optMaxErrorsPerContext #-}

optMaxLabelsPerContext :: Lens ReportOptions Int
optMaxLabelsPerContext k o = fmap (\x -> o { _optMaxLabelsPerContext = x }) (k (_optMaxLabelsPerContext o))
{-# INLINE optMaxLabelsPerContext #-}