-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

module Michelson.ErrorPos
  ( mkPos
  , Pos (..)
  , SrcPos (..)
  , srcPos
  , InstrCallStack (..)
  , LetCallStack
  , LetName (..)
  ) where

import Data.Aeson.TH (deriveJSON)
import Data.Data (Data(..))
import Data.Default (Default(..))
import qualified Data.Text as T
import Fmt (Buildable)

import Util.Aeson

newtype Pos = Pos 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
$cp1Ord :: Eq Pos
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
DataType
Constr
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 d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pos -> c Pos
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c 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)
$cPos :: Constr
$tPos :: DataType
gmapMo :: (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 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 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 :: Int -> (forall d. Data d => d -> u) -> Pos -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Pos -> u
gmapQ :: (forall d. Data d => d -> u) -> Pos -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Pos -> [u]
gmapQr :: (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 :: (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 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 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 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 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
$cp1Data :: Typeable Pos
Data)

instance NFData Pos

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

data SrcPos = SrcPos Pos 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
$cp1Ord :: Eq SrcPos
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
DataType
Constr
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 d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SrcPos -> c SrcPos
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c 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)
$cSrcPos :: Constr
$tSrcPos :: DataType
gmapMo :: (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 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 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 :: Int -> (forall d. Data d => d -> u) -> SrcPos -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> SrcPos -> u
gmapQ :: (forall d. Data d => d -> u) -> SrcPos -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> SrcPos -> [u]
gmapQr :: (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 :: (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 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 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 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 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
$cp1Data :: Typeable SrcPos
Data)

instance NFData SrcPos

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

newtype LetName = LetName T.Text
  deriving stock (LetName -> LetName -> Bool
(LetName -> LetName -> Bool)
-> (LetName -> LetName -> Bool) -> Eq LetName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LetName -> LetName -> Bool
$c/= :: LetName -> LetName -> Bool
== :: LetName -> LetName -> Bool
$c== :: LetName -> LetName -> Bool
Eq, Eq LetName
Eq LetName =>
(LetName -> LetName -> Ordering)
-> (LetName -> LetName -> Bool)
-> (LetName -> LetName -> Bool)
-> (LetName -> LetName -> Bool)
-> (LetName -> LetName -> Bool)
-> (LetName -> LetName -> LetName)
-> (LetName -> LetName -> LetName)
-> Ord LetName
LetName -> LetName -> Bool
LetName -> LetName -> Ordering
LetName -> LetName -> LetName
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 :: LetName -> LetName -> LetName
$cmin :: LetName -> LetName -> LetName
max :: LetName -> LetName -> LetName
$cmax :: LetName -> LetName -> LetName
>= :: LetName -> LetName -> Bool
$c>= :: LetName -> LetName -> Bool
> :: LetName -> LetName -> Bool
$c> :: LetName -> LetName -> Bool
<= :: LetName -> LetName -> Bool
$c<= :: LetName -> LetName -> Bool
< :: LetName -> LetName -> Bool
$c< :: LetName -> LetName -> Bool
compare :: LetName -> LetName -> Ordering
$ccompare :: LetName -> LetName -> Ordering
$cp1Ord :: Eq LetName
Ord, Int -> LetName -> ShowS
[LetName] -> ShowS
LetName -> String
(Int -> LetName -> ShowS)
-> (LetName -> String) -> ([LetName] -> ShowS) -> Show LetName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LetName] -> ShowS
$cshowList :: [LetName] -> ShowS
show :: LetName -> String
$cshow :: LetName -> String
showsPrec :: Int -> LetName -> ShowS
$cshowsPrec :: Int -> LetName -> ShowS
Show, Typeable LetName
DataType
Constr
Typeable LetName =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> LetName -> c LetName)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c LetName)
-> (LetName -> Constr)
-> (LetName -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c LetName))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LetName))
-> ((forall b. Data b => b -> b) -> LetName -> LetName)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> LetName -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> LetName -> r)
-> (forall u. (forall d. Data d => d -> u) -> LetName -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> LetName -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> LetName -> m LetName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LetName -> m LetName)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> LetName -> m LetName)
-> Data LetName
LetName -> DataType
LetName -> Constr
(forall b. Data b => b -> b) -> LetName -> LetName
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LetName -> c LetName
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LetName
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) -> LetName -> u
forall u. (forall d. Data d => d -> u) -> LetName -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LetName -> m LetName
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LetName -> m LetName
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LetName
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LetName -> c LetName
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LetName)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LetName)
$cLetName :: Constr
$tLetName :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> LetName -> m LetName
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LetName -> m LetName
gmapMp :: (forall d. Data d => d -> m d) -> LetName -> m LetName
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> LetName -> m LetName
gmapM :: (forall d. Data d => d -> m d) -> LetName -> m LetName
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> LetName -> m LetName
gmapQi :: Int -> (forall d. Data d => d -> u) -> LetName -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> LetName -> u
gmapQ :: (forall d. Data d => d -> u) -> LetName -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> LetName -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> LetName -> r
gmapT :: (forall b. Data b => b -> b) -> LetName -> LetName
$cgmapT :: (forall b. Data b => b -> b) -> LetName -> LetName
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LetName)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c LetName)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c LetName)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c LetName)
dataTypeOf :: LetName -> DataType
$cdataTypeOf :: LetName -> DataType
toConstr :: LetName -> Constr
$ctoConstr :: LetName -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LetName
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c LetName
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LetName -> c LetName
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> LetName -> c LetName
$cp1Data :: Typeable LetName
Data, (forall x. LetName -> Rep LetName x)
-> (forall x. Rep LetName x -> LetName) -> Generic LetName
forall x. Rep LetName x -> LetName
forall x. LetName -> Rep LetName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep LetName x -> LetName
$cfrom :: forall x. LetName -> Rep LetName x
Generic)
  deriving newtype LetName -> Builder
(LetName -> Builder) -> Buildable LetName
forall p. (p -> Builder) -> Buildable p
build :: LetName -> Builder
$cbuild :: LetName -> Builder
Buildable

instance NFData LetName

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

instance NFData InstrCallStack

instance Default Pos where
  def :: Pos
def = Word -> Pos
Pos 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

instance Default InstrCallStack where
  def :: InstrCallStack
def = [LetName] -> SrcPos -> InstrCallStack
InstrCallStack [LetName]
forall a. Default a => a
def SrcPos
forall a. Default a => a
def

deriveJSON morleyAesonOptions ''Pos
deriveJSON morleyAesonOptions ''SrcPos
deriveJSON morleyAesonOptions ''LetName
deriveJSON morleyAesonOptions ''InstrCallStack