-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module Morley.Michelson.ErrorPos
  ( mkPos
  , Pos (..)
  , SrcPos (..)
  , srcPos
  , ErrorSrcPos (..)
  ) where

import Unsafe qualified (fromIntegral)

import Data.Aeson.TH (deriveJSON)
import Data.Data (Data(..))
import Data.Default (Default(..))
import Fmt (Buildable(..))
import Morley.Michelson.Printer.Util (RenderDoc(..), buildRenderDocExtended, renderAnyBuildable)
import Text.PrettyPrint.Leijen.Text ((<+>))

import Morley.Util.Aeson

newtype Pos = Pos {Pos -> Word
unPos :: Word}
  deriving stock (Pos -> Pos -> Bool
(Pos -> Pos -> Bool) -> (Pos -> Pos -> Bool) -> Eq Pos
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Pos -> Pos -> Bool
$c/= :: Pos -> Pos -> Bool
== :: Pos -> Pos -> Bool
$c== :: Pos -> Pos -> Bool
Eq, Eq Pos
Eq Pos
-> (Pos -> Pos -> Ordering)
-> (Pos -> Pos -> Bool)
-> (Pos -> Pos -> Bool)
-> (Pos -> Pos -> Bool)
-> (Pos -> Pos -> Bool)
-> (Pos -> Pos -> Pos)
-> (Pos -> Pos -> Pos)
-> Ord Pos
Pos -> Pos -> Bool
Pos -> Pos -> Ordering
Pos -> Pos -> Pos
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Pos -> Pos -> Pos
$cmin :: Pos -> Pos -> Pos
max :: Pos -> Pos -> Pos
$cmax :: Pos -> Pos -> Pos
>= :: Pos -> Pos -> Bool
$c>= :: Pos -> Pos -> Bool
> :: Pos -> Pos -> Bool
$c> :: Pos -> Pos -> Bool
<= :: Pos -> Pos -> Bool
$c<= :: Pos -> Pos -> Bool
< :: Pos -> Pos -> Bool
$c< :: Pos -> Pos -> Bool
compare :: Pos -> Pos -> Ordering
$ccompare :: Pos -> Pos -> Ordering
Ord, Int -> Pos -> ShowS
[Pos] -> ShowS
Pos -> String
(Int -> Pos -> ShowS)
-> (Pos -> String) -> ([Pos] -> ShowS) -> Show Pos
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Pos] -> ShowS
$cshowList :: [Pos] -> ShowS
show :: Pos -> String
$cshow :: Pos -> String
showsPrec :: Int -> Pos -> ShowS
$cshowsPrec :: Int -> Pos -> ShowS
Show, (forall x. Pos -> Rep Pos x)
-> (forall x. Rep Pos x -> Pos) -> Generic Pos
forall x. Rep Pos x -> Pos
forall x. Pos -> Rep Pos x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Pos x -> Pos
$cfrom :: forall x. Pos -> Rep Pos x
Generic, Typeable Pos
Typeable Pos
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Pos -> c Pos)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Pos)
-> (Pos -> Constr)
-> (Pos -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Pos))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Pos))
-> ((forall b. Data b => b -> b) -> Pos -> Pos)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r)
-> (forall u. (forall d. Data d => d -> u) -> Pos -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Pos -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Pos -> m Pos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Pos -> m Pos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Pos -> m Pos)
-> Data Pos
Pos -> DataType
Pos -> Constr
(forall b. Data b => b -> b) -> Pos -> Pos
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Pos -> u
forall u. (forall d. Data d => d -> u) -> Pos -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Pos
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pos -> c Pos
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Pos)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Pos)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Pos -> m Pos
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Pos -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Pos -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Pos -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Pos -> [u]
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Pos -> r
gmapT :: (forall b. Data b => b -> b) -> Pos -> Pos
$cgmapT :: (forall b. Data b => b -> b) -> Pos -> Pos
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Pos)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Pos)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Pos)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Pos)
dataTypeOf :: Pos -> DataType
$cdataTypeOf :: Pos -> DataType
toConstr :: Pos -> Constr
$ctoConstr :: Pos -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Pos
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Pos
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pos -> c Pos
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pos -> c Pos
Data)

instance NFData Pos

mkPos :: Int -> Either Text Pos
mkPos :: Int -> Either Text Pos
mkPos Int
x
  | Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0     = Text -> Either Text Pos
forall a b. a -> Either a b
Left (Text -> Either Text Pos) -> Text -> Either Text Pos
forall a b. (a -> b) -> a -> b
$ Text
"negative pos: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall b a. (PrettyShow a, Show a, IsString b) => a -> b
show Int
x
  | Bool
otherwise = Pos -> Either Text Pos
forall a b. b -> Either a b
Right (Pos -> Either Text Pos) -> Pos -> Either Text Pos
forall a b. (a -> b) -> a -> b
$ Word -> Pos
Pos (Word -> Pos) -> Word -> Pos
forall a b. (a -> b) -> a -> b
$ forall a b. (HasCallStack, Integral a, Integral b) => a -> b
Unsafe.fromIntegral @Int @Word Int
x

data SrcPos =
  SrcPos
  { SrcPos -> Pos
srcLine :: Pos
  , SrcPos -> Pos
srcCol :: Pos
  } deriving stock (SrcPos -> SrcPos -> Bool
(SrcPos -> SrcPos -> Bool)
-> (SrcPos -> SrcPos -> Bool) -> Eq SrcPos
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SrcPos -> SrcPos -> Bool
$c/= :: SrcPos -> SrcPos -> Bool
== :: SrcPos -> SrcPos -> Bool
$c== :: SrcPos -> SrcPos -> Bool
Eq, Eq SrcPos
Eq SrcPos
-> (SrcPos -> SrcPos -> Ordering)
-> (SrcPos -> SrcPos -> Bool)
-> (SrcPos -> SrcPos -> Bool)
-> (SrcPos -> SrcPos -> Bool)
-> (SrcPos -> SrcPos -> Bool)
-> (SrcPos -> SrcPos -> SrcPos)
-> (SrcPos -> SrcPos -> SrcPos)
-> Ord SrcPos
SrcPos -> SrcPos -> Bool
SrcPos -> SrcPos -> Ordering
SrcPos -> SrcPos -> SrcPos
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SrcPos -> SrcPos -> SrcPos
$cmin :: SrcPos -> SrcPos -> SrcPos
max :: SrcPos -> SrcPos -> SrcPos
$cmax :: SrcPos -> SrcPos -> SrcPos
>= :: SrcPos -> SrcPos -> Bool
$c>= :: SrcPos -> SrcPos -> Bool
> :: SrcPos -> SrcPos -> Bool
$c> :: SrcPos -> SrcPos -> Bool
<= :: SrcPos -> SrcPos -> Bool
$c<= :: SrcPos -> SrcPos -> Bool
< :: SrcPos -> SrcPos -> Bool
$c< :: SrcPos -> SrcPos -> Bool
compare :: SrcPos -> SrcPos -> Ordering
$ccompare :: SrcPos -> SrcPos -> Ordering
Ord, Int -> SrcPos -> ShowS
[SrcPos] -> ShowS
SrcPos -> String
(Int -> SrcPos -> ShowS)
-> (SrcPos -> String) -> ([SrcPos] -> ShowS) -> Show SrcPos
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SrcPos] -> ShowS
$cshowList :: [SrcPos] -> ShowS
show :: SrcPos -> String
$cshow :: SrcPos -> String
showsPrec :: Int -> SrcPos -> ShowS
$cshowsPrec :: Int -> SrcPos -> ShowS
Show, (forall x. SrcPos -> Rep SrcPos x)
-> (forall x. Rep SrcPos x -> SrcPos) -> Generic SrcPos
forall x. Rep SrcPos x -> SrcPos
forall x. SrcPos -> Rep SrcPos x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SrcPos x -> SrcPos
$cfrom :: forall x. SrcPos -> Rep SrcPos x
Generic, Typeable SrcPos
Typeable SrcPos
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> SrcPos -> c SrcPos)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c SrcPos)
-> (SrcPos -> Constr)
-> (SrcPos -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c SrcPos))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c SrcPos))
-> ((forall b. Data b => b -> b) -> SrcPos -> SrcPos)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> SrcPos -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> SrcPos -> r)
-> (forall u. (forall d. Data d => d -> u) -> SrcPos -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> SrcPos -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> SrcPos -> m SrcPos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> SrcPos -> m SrcPos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> SrcPos -> m SrcPos)
-> Data SrcPos
SrcPos -> DataType
SrcPos -> Constr
(forall b. Data b => b -> b) -> SrcPos -> SrcPos
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> SrcPos -> u
forall u. (forall d. Data d => d -> u) -> SrcPos -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c SrcPos
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SrcPos -> c SrcPos
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c SrcPos)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c SrcPos)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> SrcPos -> m SrcPos
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> SrcPos -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> SrcPos -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> SrcPos -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> SrcPos -> [u]
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> SrcPos -> r
gmapT :: (forall b. Data b => b -> b) -> SrcPos -> SrcPos
$cgmapT :: (forall b. Data b => b -> b) -> SrcPos -> SrcPos
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c SrcPos)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c SrcPos)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c SrcPos)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c SrcPos)
dataTypeOf :: SrcPos -> DataType
$cdataTypeOf :: SrcPos -> DataType
toConstr :: SrcPos -> Constr
$ctoConstr :: SrcPos -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c SrcPos
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c SrcPos
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SrcPos -> c SrcPos
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SrcPos -> c SrcPos
Data)

instance Buildable SrcPos where
  build :: SrcPos -> Builder
build (SrcPos (Pos Word
l) (Pos Word
c)) = Word -> Builder
forall p. Buildable p => p -> Builder
build Word
l Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
":" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word -> Builder
forall p. Buildable p => p -> Builder
build Word
c

instance NFData SrcPos

srcPos :: Word -> Word -> SrcPos
srcPos :: Word -> Word -> SrcPos
srcPos Word
x Word
y = Pos -> Pos -> SrcPos
SrcPos (Word -> Pos
Pos Word
x) (Word -> Pos
Pos Word
y)

newtype ErrorSrcPos = ErrorSrcPos
  { ErrorSrcPos -> SrcPos
unErrorSrcPos :: SrcPos
  } deriving stock (ErrorSrcPos -> ErrorSrcPos -> Bool
(ErrorSrcPos -> ErrorSrcPos -> Bool)
-> (ErrorSrcPos -> ErrorSrcPos -> Bool) -> Eq ErrorSrcPos
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c/= :: ErrorSrcPos -> ErrorSrcPos -> Bool
== :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c== :: ErrorSrcPos -> ErrorSrcPos -> Bool
Eq, Eq ErrorSrcPos
Eq ErrorSrcPos
-> (ErrorSrcPos -> ErrorSrcPos -> Ordering)
-> (ErrorSrcPos -> ErrorSrcPos -> Bool)
-> (ErrorSrcPos -> ErrorSrcPos -> Bool)
-> (ErrorSrcPos -> ErrorSrcPos -> Bool)
-> (ErrorSrcPos -> ErrorSrcPos -> Bool)
-> (ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos)
-> (ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos)
-> Ord ErrorSrcPos
ErrorSrcPos -> ErrorSrcPos -> Bool
ErrorSrcPos -> ErrorSrcPos -> Ordering
ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos
$cmin :: ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos
max :: ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos
$cmax :: ErrorSrcPos -> ErrorSrcPos -> ErrorSrcPos
>= :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c>= :: ErrorSrcPos -> ErrorSrcPos -> Bool
> :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c> :: ErrorSrcPos -> ErrorSrcPos -> Bool
<= :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c<= :: ErrorSrcPos -> ErrorSrcPos -> Bool
< :: ErrorSrcPos -> ErrorSrcPos -> Bool
$c< :: ErrorSrcPos -> ErrorSrcPos -> Bool
compare :: ErrorSrcPos -> ErrorSrcPos -> Ordering
$ccompare :: ErrorSrcPos -> ErrorSrcPos -> Ordering
Ord, Int -> ErrorSrcPos -> ShowS
[ErrorSrcPos] -> ShowS
ErrorSrcPos -> String
(Int -> ErrorSrcPos -> ShowS)
-> (ErrorSrcPos -> String)
-> ([ErrorSrcPos] -> ShowS)
-> Show ErrorSrcPos
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ErrorSrcPos] -> ShowS
$cshowList :: [ErrorSrcPos] -> ShowS
show :: ErrorSrcPos -> String
$cshow :: ErrorSrcPos -> String
showsPrec :: Int -> ErrorSrcPos -> ShowS
$cshowsPrec :: Int -> ErrorSrcPos -> ShowS
Show, (forall x. ErrorSrcPos -> Rep ErrorSrcPos x)
-> (forall x. Rep ErrorSrcPos x -> ErrorSrcPos)
-> Generic ErrorSrcPos
forall x. Rep ErrorSrcPos x -> ErrorSrcPos
forall x. ErrorSrcPos -> Rep ErrorSrcPos x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ErrorSrcPos x -> ErrorSrcPos
$cfrom :: forall x. ErrorSrcPos -> Rep ErrorSrcPos x
Generic, Typeable ErrorSrcPos
Typeable ErrorSrcPos
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> ErrorSrcPos -> c ErrorSrcPos)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ErrorSrcPos)
-> (ErrorSrcPos -> Constr)
-> (ErrorSrcPos -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ErrorSrcPos))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c ErrorSrcPos))
-> ((forall b. Data b => b -> b) -> ErrorSrcPos -> ErrorSrcPos)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r)
-> (forall u. (forall d. Data d => d -> u) -> ErrorSrcPos -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ErrorSrcPos -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos)
-> Data ErrorSrcPos
ErrorSrcPos -> DataType
ErrorSrcPos -> Constr
(forall b. Data b => b -> b) -> ErrorSrcPos -> ErrorSrcPos
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ErrorSrcPos -> u
forall u. (forall d. Data d => d -> u) -> ErrorSrcPos -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ErrorSrcPos
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ErrorSrcPos -> c ErrorSrcPos
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ErrorSrcPos)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ErrorSrcPos)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ErrorSrcPos -> m ErrorSrcPos
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ErrorSrcPos -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ErrorSrcPos -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> ErrorSrcPos -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ErrorSrcPos -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ErrorSrcPos -> r
gmapT :: (forall b. Data b => b -> b) -> ErrorSrcPos -> ErrorSrcPos
$cgmapT :: (forall b. Data b => b -> b) -> ErrorSrcPos -> ErrorSrcPos
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ErrorSrcPos)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ErrorSrcPos)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ErrorSrcPos)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ErrorSrcPos)
dataTypeOf :: ErrorSrcPos -> DataType
$cdataTypeOf :: ErrorSrcPos -> DataType
toConstr :: ErrorSrcPos -> Constr
$ctoConstr :: ErrorSrcPos -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ErrorSrcPos
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ErrorSrcPos
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ErrorSrcPos -> c ErrorSrcPos
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ErrorSrcPos -> c ErrorSrcPos
Data)
    deriving newtype (ErrorSrcPos
ErrorSrcPos -> Default ErrorSrcPos
forall a. a -> Default a
def :: ErrorSrcPos
$cdef :: ErrorSrcPos
Default)
    deriving anyclass (ErrorSrcPos -> ()
(ErrorSrcPos -> ()) -> NFData ErrorSrcPos
forall a. (a -> ()) -> NFData a
rnf :: ErrorSrcPos -> ()
$crnf :: ErrorSrcPos -> ()
NFData)

instance RenderDoc ErrorSrcPos where
  renderDoc :: RenderContext -> ErrorSrcPos -> Doc
renderDoc RenderContext
_ ErrorSrcPos{unErrorSrcPos :: ErrorSrcPos -> SrcPos
unErrorSrcPos = SrcPos (Pos Word
row) (Pos Word
col)} =
    Doc
"Error occurred on line" Doc -> Doc -> Doc
<+> (Word -> Doc
forall a. Buildable a => a -> Doc
renderAnyBuildable (Word
row Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1)) Doc -> Doc -> Doc
<+> Doc
"char" Doc -> Doc -> Doc
<+> (Word -> Doc
forall a. Buildable a => a -> Doc
renderAnyBuildable (Word
col Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1))
    Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
"."

instance Buildable ErrorSrcPos where
  build :: ErrorSrcPos -> Builder
build = ErrorSrcPos -> Builder
forall a. RenderDoc a => a -> Builder
buildRenderDocExtended

instance Default Pos where
  def :: Pos
def = Word -> Pos
Pos Word
0

instance Default SrcPos where
  def :: SrcPos
def = Pos -> Pos -> SrcPos
SrcPos Pos
forall a. Default a => a
def Pos
forall a. Default a => a
def

deriveJSON morleyAesonOptions ''Pos
deriveJSON morleyAesonOptions ''SrcPos
deriveJSON morleyAesonOptions ''ErrorSrcPos