{-# OPTIONS_GHC -Wunused-imports #-}
module Agda.Compiler.MAlonzo.Misc where
import Control.Monad.Reader ( ask )
import Control.Monad.State ( modify )
import Control.Monad.Trans ( MonadTrans(lift) )
import Control.Monad.Trans.Except ( ExceptT )
import Control.Monad.Trans.Identity ( IdentityT )
import Control.Monad.Trans.Maybe ( MaybeT )
import Control.Monad.Trans.Reader ( ReaderT(runReaderT) )
import Control.Monad.Trans.State ( StateT(runStateT) )
import Data.Char
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Text (Text)
import qualified Data.Text as T
import qualified Agda.Utils.Haskell.Syntax as HS
import Agda.Compiler.Common as CC
import Agda.Syntax.Common
import Agda.Syntax.Internal
import Agda.Syntax.TopLevelModuleName
import Agda.TypeChecking.Monad
import Agda.Syntax.Common.Pretty
import Agda.Utils.CallStack ( HasCallStack )
import Agda.Utils.Impossible
data HsModuleEnv = HsModuleEnv
{ HsModuleEnv -> TopLevelModuleName' Range
mazModuleName :: TopLevelModuleName
, HsModuleEnv -> Bool
mazIsMainModule :: Bool
}
data GHCOptions = GHCOptions
{ GHCOptions -> Bool
optGhcCallGhc :: Bool
, GHCOptions -> [Char]
optGhcBin :: FilePath
, GHCOptions -> [[Char]]
optGhcFlags :: [String]
, GHCOptions -> [Char]
optGhcCompileDir :: FilePath
, GHCOptions -> Bool
optGhcStrictData :: Bool
, GHCOptions -> Bool
optGhcStrict :: Bool
, GHCOptions -> Bool
optGhcTrace :: Bool
}
data GHCEnv = GHCEnv
{ GHCEnv -> GHCOptions
ghcEnvOpts :: GHCOptions
, GHCEnv -> Maybe QName
ghcEnvBool
, GHCEnv -> Maybe QName
ghcEnvTrue
, GHCEnv -> Maybe QName
ghcEnvFalse
, GHCEnv -> Maybe QName
ghcEnvMaybe
, GHCEnv -> Maybe QName
ghcEnvNothing
, GHCEnv -> Maybe QName
ghcEnvJust
, GHCEnv -> Maybe QName
ghcEnvList
, GHCEnv -> Maybe QName
ghcEnvNil
, GHCEnv -> Maybe QName
ghcEnvCons
, GHCEnv -> Maybe QName
ghcEnvNat
, GHCEnv -> Maybe QName
ghcEnvInteger
, GHCEnv -> Maybe QName
ghcEnvWord64
, GHCEnv -> Maybe QName
ghcEnvInf
, GHCEnv -> Maybe QName
ghcEnvSharp
, GHCEnv -> Maybe QName
ghcEnvFlat
, GHCEnv -> Maybe QName
ghcEnvInterval
, GHCEnv -> Maybe QName
ghcEnvIZero
, GHCEnv -> Maybe QName
ghcEnvIOne
, GHCEnv -> Maybe QName
ghcEnvIsOne
, GHCEnv -> Maybe QName
ghcEnvItIsOne
, GHCEnv -> Maybe QName
ghcEnvIsOne1
, GHCEnv -> Maybe QName
ghcEnvIsOne2
, GHCEnv -> Maybe QName
ghcEnvIsOneEmpty
, GHCEnv -> Maybe QName
ghcEnvPathP
, GHCEnv -> Maybe QName
ghcEnvSub
, GHCEnv -> Maybe QName
ghcEnvSubIn
:: Maybe QName
, GHCEnv -> QName -> Bool
ghcEnvIsTCBuiltin :: QName -> Bool
, GHCEnv -> Maybe Int
ghcEnvListArity :: Maybe Int
, GHCEnv -> Maybe Int
ghcEnvMaybeArity :: Maybe Int
}
data GHCModuleEnv = GHCModuleEnv
{ GHCModuleEnv -> GHCEnv
ghcModEnv :: GHCEnv
, GHCModuleEnv -> HsModuleEnv
ghcModHsModuleEnv :: HsModuleEnv
}
class Monad m => ReadGHCModuleEnv m where
askGHCModuleEnv :: m GHCModuleEnv
default askGHCModuleEnv
:: (MonadTrans t, m ~ (t n), ReadGHCModuleEnv n)
=> m GHCModuleEnv
askGHCModuleEnv = n GHCModuleEnv -> t n GHCModuleEnv
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift n GHCModuleEnv
forall (m :: * -> *). ReadGHCModuleEnv m => m GHCModuleEnv
askGHCModuleEnv
askHsModuleEnv :: m HsModuleEnv
askHsModuleEnv = GHCModuleEnv -> HsModuleEnv
ghcModHsModuleEnv (GHCModuleEnv -> HsModuleEnv) -> m GHCModuleEnv -> m HsModuleEnv
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m GHCModuleEnv
forall (m :: * -> *). ReadGHCModuleEnv m => m GHCModuleEnv
askGHCModuleEnv
askGHCEnv :: m GHCEnv
askGHCEnv = GHCModuleEnv -> GHCEnv
ghcModEnv (GHCModuleEnv -> GHCEnv) -> m GHCModuleEnv -> m GHCEnv
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m GHCModuleEnv
forall (m :: * -> *). ReadGHCModuleEnv m => m GHCModuleEnv
askGHCModuleEnv
instance Monad m => ReadGHCModuleEnv (ReaderT GHCModuleEnv m) where
askGHCModuleEnv :: ReaderT GHCModuleEnv m GHCModuleEnv
askGHCModuleEnv = ReaderT GHCModuleEnv m GHCModuleEnv
forall r (m :: * -> *). MonadReader r m => m r
ask
instance ReadGHCModuleEnv m => ReadGHCModuleEnv (ExceptT e m)
instance ReadGHCModuleEnv m => ReadGHCModuleEnv (IdentityT m)
instance ReadGHCModuleEnv m => ReadGHCModuleEnv (MaybeT m)
instance ReadGHCModuleEnv m => ReadGHCModuleEnv (StateT s m)
newtype HsCompileState = HsCompileState
{ HsCompileState -> Set (TopLevelModuleName' Range)
mazAccumlatedImports :: Set TopLevelModuleName
} deriving (HsCompileState -> HsCompileState -> Bool
(HsCompileState -> HsCompileState -> Bool)
-> (HsCompileState -> HsCompileState -> Bool) -> Eq HsCompileState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: HsCompileState -> HsCompileState -> Bool
== :: HsCompileState -> HsCompileState -> Bool
$c/= :: HsCompileState -> HsCompileState -> Bool
/= :: HsCompileState -> HsCompileState -> Bool
Eq, NonEmpty HsCompileState -> HsCompileState
HsCompileState -> HsCompileState -> HsCompileState
(HsCompileState -> HsCompileState -> HsCompileState)
-> (NonEmpty HsCompileState -> HsCompileState)
-> (forall b. Integral b => b -> HsCompileState -> HsCompileState)
-> Semigroup HsCompileState
forall b. Integral b => b -> HsCompileState -> HsCompileState
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: HsCompileState -> HsCompileState -> HsCompileState
<> :: HsCompileState -> HsCompileState -> HsCompileState
$csconcat :: NonEmpty HsCompileState -> HsCompileState
sconcat :: NonEmpty HsCompileState -> HsCompileState
$cstimes :: forall b. Integral b => b -> HsCompileState -> HsCompileState
stimes :: forall b. Integral b => b -> HsCompileState -> HsCompileState
Semigroup, Semigroup HsCompileState
HsCompileState
Semigroup HsCompileState =>
HsCompileState
-> (HsCompileState -> HsCompileState -> HsCompileState)
-> ([HsCompileState] -> HsCompileState)
-> Monoid HsCompileState
[HsCompileState] -> HsCompileState
HsCompileState -> HsCompileState -> HsCompileState
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: HsCompileState
mempty :: HsCompileState
$cmappend :: HsCompileState -> HsCompileState -> HsCompileState
mappend :: HsCompileState -> HsCompileState -> HsCompileState
$cmconcat :: [HsCompileState] -> HsCompileState
mconcat :: [HsCompileState] -> HsCompileState
Monoid)
type HsCompileT m = ReaderT GHCModuleEnv (StateT HsCompileState m)
type HsCompileM = HsCompileT TCM
runHsCompileT' :: HsCompileT m a -> GHCModuleEnv -> HsCompileState -> m (a, HsCompileState)
runHsCompileT' :: forall (m :: * -> *) a.
HsCompileT m a
-> GHCModuleEnv -> HsCompileState -> m (a, HsCompileState)
runHsCompileT' HsCompileT m a
t GHCModuleEnv
e HsCompileState
s = ((StateT HsCompileState m a
-> HsCompileState -> m (a, HsCompileState))
-> HsCompileState
-> StateT HsCompileState m a
-> m (a, HsCompileState)
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT HsCompileState m a
-> HsCompileState -> m (a, HsCompileState)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT HsCompileState
s) (StateT HsCompileState m a -> m (a, HsCompileState))
-> (HsCompileT m a -> StateT HsCompileState m a)
-> HsCompileT m a
-> m (a, HsCompileState)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((HsCompileT m a -> GHCModuleEnv -> StateT HsCompileState m a)
-> GHCModuleEnv -> HsCompileT m a -> StateT HsCompileState m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip HsCompileT m a -> GHCModuleEnv -> StateT HsCompileState m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT GHCModuleEnv
e) (HsCompileT m a -> m (a, HsCompileState))
-> HsCompileT m a -> m (a, HsCompileState)
forall a b. (a -> b) -> a -> b
$ HsCompileT m a
t
runHsCompileT :: HsCompileT m a -> GHCModuleEnv -> m (a, HsCompileState)
runHsCompileT :: forall (m :: * -> *) a.
HsCompileT m a -> GHCModuleEnv -> m (a, HsCompileState)
runHsCompileT HsCompileT m a
t GHCModuleEnv
e = HsCompileT m a
-> GHCModuleEnv -> HsCompileState -> m (a, HsCompileState)
forall (m :: * -> *) a.
HsCompileT m a
-> GHCModuleEnv -> HsCompileState -> m (a, HsCompileState)
runHsCompileT' HsCompileT m a
t GHCModuleEnv
e HsCompileState
forall a. Monoid a => a
mempty
ghcBackendError :: (HasCallStack, MonadTCError m) => GHCBackendError -> m a
ghcBackendError :: forall (m :: * -> *) a.
(HasCallStack, MonadTCError m) =>
GHCBackendError -> m a
ghcBackendError = (GHCBackendError -> TypeError)
-> HasCallStack => GHCBackendError -> m a
forall (m :: * -> *) a b.
MonadTCError m =>
(a -> TypeError) -> HasCallStack => a -> m b
locatedTypeError GHCBackendError -> TypeError
GHCBackendError
curIsMainModule :: ReadGHCModuleEnv m => m Bool
curIsMainModule :: forall (m :: * -> *). ReadGHCModuleEnv m => m Bool
curIsMainModule = HsModuleEnv -> Bool
mazIsMainModule (HsModuleEnv -> Bool) -> m HsModuleEnv -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m HsModuleEnv
forall (m :: * -> *). ReadGHCModuleEnv m => m HsModuleEnv
askHsModuleEnv
curAgdaMod :: ReadGHCModuleEnv m => m TopLevelModuleName
curAgdaMod :: forall (m :: * -> *).
ReadGHCModuleEnv m =>
m (TopLevelModuleName' Range)
curAgdaMod = HsModuleEnv -> TopLevelModuleName' Range
mazModuleName (HsModuleEnv -> TopLevelModuleName' Range)
-> m HsModuleEnv -> m (TopLevelModuleName' Range)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m HsModuleEnv
forall (m :: * -> *). ReadGHCModuleEnv m => m HsModuleEnv
askHsModuleEnv
curHsMod :: ReadGHCModuleEnv m => m HS.ModuleName
curHsMod :: forall (m :: * -> *). ReadGHCModuleEnv m => m ModuleName
curHsMod = TopLevelModuleName' Range -> ModuleName
mazMod (TopLevelModuleName' Range -> ModuleName)
-> m (TopLevelModuleName' Range) -> m ModuleName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (TopLevelModuleName' Range)
forall (m :: * -> *).
ReadGHCModuleEnv m =>
m (TopLevelModuleName' Range)
curAgdaMod
data FunctionKind = NoUnused | PossiblyUnused
data VariableKind = A | V | X
data NameKind
= TypeK
| ConK
| VarK VariableKind
| CoverK
| CheckK
| FunK FunctionKind
encodeString :: NameKind -> String -> String
encodeString :: NameKind -> [Char] -> [Char]
encodeString NameKind
k [Char]
s = [Char]
prefix [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ (Char -> [Char]) -> [Char] -> [Char]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> [Char]
encode [Char]
s
where
encode :: Char -> [Char]
encode Char
'\'' = [Char]
"''"
encode Char
c
| Char -> Bool
isLower Char
c Bool -> Bool -> Bool
|| Char -> Bool
isUpper Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
||
Char -> GeneralCategory
generalCategory Char
c GeneralCategory -> GeneralCategory -> Bool
forall a. Eq a => a -> a -> Bool
== GeneralCategory
DecimalNumber =
[Char
c]
| Bool
otherwise =
[Char]
"'" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show (Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
c) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"'"
prefix :: [Char]
prefix = case NameKind
k of
NameKind
TypeK -> [Char]
"T"
NameKind
ConK -> [Char]
"C"
VarK VariableKind
A -> [Char]
"a"
VarK VariableKind
V -> [Char]
"v"
VarK VariableKind
X -> [Char]
"x"
NameKind
CoverK -> [Char]
"cover"
NameKind
CheckK -> [Char]
"check"
FunK FunctionKind
NoUnused -> [Char]
"du"
FunK FunctionKind
PossiblyUnused -> [Char]
"d"
ihname :: VariableKind -> Nat -> HS.Name
ihname :: VariableKind -> Int -> Name
ihname VariableKind
k Int
i = [Char] -> Name
HS.Ident ([Char] -> Name) -> [Char] -> Name
forall a b. (a -> b) -> a -> b
$ NameKind -> [Char] -> [Char]
encodeString (VariableKind -> NameKind
VarK VariableKind
k) (Int -> [Char]
forall a. Show a => a -> [Char]
show Int
i)
unqhname :: NameKind -> QName -> HS.Name
unqhname :: NameKind -> QName -> Name
unqhname NameKind
k QName
q =
[Char] -> Name
HS.Ident ([Char] -> Name) -> [Char] -> Name
forall a b. (a -> b) -> a -> b
$ NameKind -> [Char] -> [Char]
encodeString NameKind
k ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$
[Char]
"_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Name -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow (Name -> Name
nameCanonical Name
n) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ NameId -> [Char]
idnum (Name -> NameId
forall a. HasNameId a => a -> NameId
nameId Name
n)
where
n :: Name
n = QName -> Name
qnameName QName
q
idnum :: NameId -> [Char]
idnum (NameId Word64
x ModuleNameHash
_) = Integer -> [Char]
forall a. Show a => a -> [Char]
show (Word64 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x)
tlmodOf :: ReadTCState m => ModuleName -> m HS.ModuleName
tlmodOf :: forall (m :: * -> *). ReadTCState m => ModuleName -> m ModuleName
tlmodOf = (TopLevelModuleName' Range -> ModuleName)
-> m (TopLevelModuleName' Range) -> m ModuleName
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TopLevelModuleName' Range -> ModuleName
mazMod (m (TopLevelModuleName' Range) -> m ModuleName)
-> (ModuleName -> m (TopLevelModuleName' Range))
-> ModuleName
-> m ModuleName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleName -> m (TopLevelModuleName' Range)
forall (m :: * -> *).
ReadTCState m =>
ModuleName -> m (TopLevelModuleName' Range)
CC.topLevelModuleName
xqual :: QName -> HS.Name -> HsCompileM HS.QName
xqual :: QName -> Name -> HsCompileM QName
xqual QName
q Name
n = do
m1 <- ModuleName
-> ReaderT
GHCModuleEnv
(StateT HsCompileState TCM)
(TopLevelModuleName' Range)
forall (m :: * -> *).
ReadTCState m =>
ModuleName -> m (TopLevelModuleName' Range)
CC.topLevelModuleName (QName -> ModuleName
qnameModule QName
q)
m2 <- curAgdaMod
if m1 == m2
then return (HS.UnQual n)
else do
modify (HsCompileState . Set.insert m1 . mazAccumlatedImports)
return (HS.Qual (mazMod m1) n)
xhqn :: NameKind -> QName -> HsCompileM HS.QName
xhqn :: NameKind -> QName -> HsCompileM QName
xhqn NameKind
k QName
q = QName -> Name -> HsCompileM QName
xqual QName
q (NameKind -> QName -> Name
unqhname NameKind
k QName
q)
hsName :: String -> HS.QName
hsName :: [Char] -> QName
hsName [Char]
s = Name -> QName
HS.UnQual ([Char] -> Name
HS.Ident [Char]
s)
conhqn :: QName -> HsCompileM HS.QName
conhqn :: QName -> HsCompileM QName
conhqn QName
q = NameKind -> QName -> HsCompileM QName
xhqn NameKind
ConK (QName -> HsCompileM QName)
-> ReaderT GHCModuleEnv (StateT HsCompileState TCM) QName
-> HsCompileM QName
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< QName -> ReaderT GHCModuleEnv (StateT HsCompileState TCM) QName
forall (m :: * -> *). HasConstInfo m => QName -> m QName
canonicalName QName
q
bltQual :: BuiltinId -> String -> HsCompileM HS.QName
bltQual :: BuiltinId -> [Char] -> HsCompileM QName
bltQual BuiltinId
b [Char]
s = do
Def q _ <- BuiltinId -> ReaderT GHCModuleEnv (StateT HsCompileState TCM) Term
forall (m :: * -> *).
(HasBuiltins m, MonadTCError m) =>
BuiltinId -> m Term
getBuiltin BuiltinId
b
xqual q (HS.Ident s)
dname :: QName -> HS.Name
dname :: QName -> Name
dname QName
q = NameKind -> QName -> Name
unqhname (FunctionKind -> NameKind
FunK FunctionKind
PossiblyUnused) QName
q
duname :: QName -> HS.Name
duname :: QName -> Name
duname QName
q = NameKind -> QName -> Name
unqhname (FunctionKind -> NameKind
FunK FunctionKind
NoUnused) QName
q
hsPrimOp :: String -> HS.QOp
hsPrimOp :: [Char] -> QOp
hsPrimOp [Char]
s = QName -> QOp
HS.QVarOp (QName -> QOp) -> QName -> QOp
forall a b. (a -> b) -> a -> b
$ Name -> QName
HS.UnQual (Name -> QName) -> Name -> QName
forall a b. (a -> b) -> a -> b
$ [Char] -> Name
HS.Symbol [Char]
s
hsPrimOpApp :: String -> HS.Exp -> HS.Exp -> HS.Exp
hsPrimOpApp :: [Char] -> Exp -> Exp -> Exp
hsPrimOpApp [Char]
op Exp
e Exp
e1 = Exp -> QOp -> Exp -> Exp
HS.InfixApp Exp
e ([Char] -> QOp
hsPrimOp [Char]
op) Exp
e1
hsInt :: Integer -> HS.Exp
hsInt :: Integer -> Exp
hsInt Integer
n = Literal -> Exp
HS.Lit (Integer -> Literal
HS.Int Integer
n)
hsTypedInt :: Integral a => a -> HS.Exp
hsTypedInt :: forall a. Integral a => a -> Exp
hsTypedInt a
n = Exp -> Type -> Exp
HS.ExpTypeSig (Literal -> Exp
HS.Lit (Integer -> Literal
HS.Int (Integer -> Literal) -> Integer -> Literal
forall a b. (a -> b) -> a -> b
$ a -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
n)) (QName -> Type
HS.TyCon ([Char] -> QName
hsName [Char]
"Integer"))
hsTypedDouble :: Real a => a -> HS.Exp
hsTypedDouble :: forall a. Real a => a -> Exp
hsTypedDouble a
n = Exp -> Type -> Exp
HS.ExpTypeSig (Literal -> Exp
HS.Lit (Rational -> Literal
HS.Frac (Rational -> Literal) -> Rational -> Literal
forall a b. (a -> b) -> a -> b
$ a -> Rational
forall a. Real a => a -> Rational
toRational a
n)) (QName -> Type
HS.TyCon ([Char] -> QName
hsName [Char]
"Double"))
hsLet :: HS.Name -> HS.Exp -> HS.Exp -> HS.Exp
hsLet :: Name -> Exp -> Exp -> Exp
hsLet Name
x Exp
e Exp
b =
Binds -> Exp -> Exp
HS.Let ([Decl] -> Binds
HS.BDecls [Strictness -> Name -> Rhs -> Decl
HS.LocalBind Strictness
HS.Lazy Name
x (Exp -> Rhs
HS.UnGuardedRhs Exp
e)]) Exp
b
hsVarUQ :: HS.Name -> HS.Exp
hsVarUQ :: Name -> Exp
hsVarUQ = QName -> Exp
HS.Var (QName -> Exp) -> (Name -> QName) -> Name -> Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> QName
HS.UnQual
hsAppView :: HS.Exp -> [HS.Exp]
hsAppView :: Exp -> [Exp]
hsAppView = [Exp] -> [Exp]
forall a. [a] -> [a]
reverse ([Exp] -> [Exp]) -> (Exp -> [Exp]) -> Exp -> [Exp]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp -> [Exp]
view
where
view :: Exp -> [Exp]
view (HS.App Exp
e Exp
e1) = Exp
e1 Exp -> [Exp] -> [Exp]
forall a. a -> [a] -> [a]
: Exp -> [Exp]
view Exp
e
view (HS.InfixApp Exp
e1 QOp
op Exp
e2) = [Exp
e2, Exp
e1, QOp -> Exp
hsOpToExp QOp
op]
view Exp
e = [Exp
e]
hsOpToExp :: HS.QOp -> HS.Exp
hsOpToExp :: QOp -> Exp
hsOpToExp (HS.QVarOp QName
x) = QName -> Exp
HS.Var QName
x
hsLambda :: [HS.Pat] -> HS.Exp -> HS.Exp
hsLambda :: [Pat] -> Exp -> Exp
hsLambda [Pat]
ps (HS.Lambda [Pat]
ps1 Exp
e) = [Pat] -> Exp -> Exp
HS.Lambda ([Pat]
ps [Pat] -> [Pat] -> [Pat]
forall a. [a] -> [a] -> [a]
++ [Pat]
ps1) Exp
e
hsLambda [Pat]
ps Exp
e = [Pat] -> Exp -> Exp
HS.Lambda [Pat]
ps Exp
e
hsMapAlt :: (HS.Exp -> HS.Exp) -> HS.Alt -> HS.Alt
hsMapAlt :: (Exp -> Exp) -> Alt -> Alt
hsMapAlt Exp -> Exp
f (HS.Alt Pat
p Rhs
rhs Maybe Binds
wh) = Pat -> Rhs -> Maybe Binds -> Alt
HS.Alt Pat
p ((Exp -> Exp) -> Rhs -> Rhs
hsMapRHS Exp -> Exp
f Rhs
rhs) Maybe Binds
wh
hsMapRHS :: (HS.Exp -> HS.Exp) -> HS.Rhs -> HS.Rhs
hsMapRHS :: (Exp -> Exp) -> Rhs -> Rhs
hsMapRHS Exp -> Exp
f (HS.UnGuardedRhs Exp
def) = Exp -> Rhs
HS.UnGuardedRhs (Exp -> Exp
f Exp
def)
hsMapRHS Exp -> Exp
f (HS.GuardedRhss [GuardedRhs]
es) = [GuardedRhs] -> Rhs
HS.GuardedRhss [ [Stmt] -> Exp -> GuardedRhs
HS.GuardedRhs [Stmt]
g (Exp -> Exp
f Exp
e) | HS.GuardedRhs [Stmt]
g Exp
e <- [GuardedRhs]
es ]
mazstr :: String
mazstr :: [Char]
mazstr = [Char]
"MAlonzo.Code"
mazName :: Name
mazName :: Name
mazName = NameId -> [Char] -> Name
forall a. MkName a => NameId -> a -> Name
mkName_ NameId
forall a. HasCallStack => a
__IMPOSSIBLE__ [Char]
mazstr
mazMod' :: String -> HS.ModuleName
mazMod' :: [Char] -> ModuleName
mazMod' [Char]
s = [Char] -> ModuleName
HS.ModuleName ([Char] -> ModuleName) -> [Char] -> ModuleName
forall a b. (a -> b) -> a -> b
$ [Char]
mazstr [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
s
mazMod :: TopLevelModuleName -> HS.ModuleName
mazMod :: TopLevelModuleName' Range -> ModuleName
mazMod = [Char] -> ModuleName
mazMod' ([Char] -> ModuleName)
-> (TopLevelModuleName' Range -> [Char])
-> TopLevelModuleName' Range
-> ModuleName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TopLevelModuleName' Range -> [Char]
forall a. Pretty a => a -> [Char]
prettyShow
mazCoerceName :: String
mazCoerceName :: [Char]
mazCoerceName = [Char]
"coe"
mazErasedName :: String
mazErasedName :: [Char]
mazErasedName = [Char]
"erased"
mazAnyTypeName :: String
mazAnyTypeName :: [Char]
mazAnyTypeName = [Char]
"AgdaAny"
mazCoerce :: HS.Exp
mazCoerce :: Exp
mazCoerce = QName -> Exp
HS.Var (QName -> Exp) -> QName -> Exp
forall a b. (a -> b) -> a -> b
$ Name -> QName
HS.UnQual (Name -> QName) -> Name -> QName
forall a b. (a -> b) -> a -> b
$ [Char] -> Name
HS.Ident [Char]
mazCoerceName
mazUnreachableError :: HS.Exp
mazUnreachableError :: Exp
mazUnreachableError = QName -> Exp
HS.Var (QName -> Exp) -> QName -> Exp
forall a b. (a -> b) -> a -> b
$ ModuleName -> Name -> QName
HS.Qual ModuleName
mazRTE (Name -> QName) -> Name -> QName
forall a b. (a -> b) -> a -> b
$ [Char] -> Name
HS.Ident [Char]
"mazUnreachableError"
rtmUnreachableError :: HS.Exp
rtmUnreachableError :: Exp
rtmUnreachableError = Exp
mazUnreachableError
mazHole :: HS.Exp
mazHole :: Exp
mazHole = QName -> Exp
HS.Var (QName -> Exp) -> QName -> Exp
forall a b. (a -> b) -> a -> b
$ ModuleName -> Name -> QName
HS.Qual ModuleName
mazRTE (Name -> QName) -> Name -> QName
forall a b. (a -> b) -> a -> b
$ [Char] -> Name
HS.Ident [Char]
"mazHole"
rtmHole :: String -> HS.Exp
rtmHole :: [Char] -> Exp
rtmHole [Char]
s = Exp
mazHole Exp -> Exp -> Exp
`HS.App` Literal -> Exp
HS.Lit (Text -> Literal
HS.String (Text -> Literal) -> Text -> Literal
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack [Char]
s)
mazAnyType :: HS.Type
mazAnyType :: Type
mazAnyType = QName -> Type
HS.TyCon ([Char] -> QName
hsName [Char]
mazAnyTypeName)
mazRTE :: HS.ModuleName
mazRTE :: ModuleName
mazRTE = [Char] -> ModuleName
HS.ModuleName [Char]
"MAlonzo.RTE"
mazRTEFloat :: HS.ModuleName
mazRTEFloat :: ModuleName
mazRTEFloat = [Char] -> ModuleName
HS.ModuleName [Char]
"MAlonzo.RTE.Float"
rtmQual :: String -> HS.QName
rtmQual :: [Char] -> QName
rtmQual = Name -> QName
HS.UnQual (Name -> QName) -> ([Char] -> Name) -> [Char] -> QName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Name
HS.Ident
rtmVar :: String -> HS.Exp
rtmVar :: [Char] -> Exp
rtmVar = QName -> Exp
HS.Var (QName -> Exp) -> ([Char] -> QName) -> [Char] -> Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> QName
rtmQual
rtmError :: Text -> HS.Exp
rtmError :: Text -> Exp
rtmError Text
s = [Char] -> Exp
rtmVar [Char]
"error" Exp -> Exp -> Exp
`HS.App`
Literal -> Exp
HS.Lit (Text -> Literal
HS.String (Text -> Literal) -> Text -> Literal
forall a b. (a -> b) -> a -> b
$ Text -> Text -> Text
T.append Text
"MAlonzo Runtime Error: " Text
s)
unsafeCoerceMod :: HS.ModuleName
unsafeCoerceMod :: ModuleName
unsafeCoerceMod = [Char] -> ModuleName
HS.ModuleName [Char]
"Unsafe.Coerce"
fakeD :: HS.Name -> String -> HS.Decl
fakeD :: Name -> [Char] -> Decl
fakeD Name
v [Char]
s = [Match] -> Decl
HS.FunBind [Name -> [Pat] -> Rhs -> Maybe Binds -> Match
HS.Match Name
v [] (Exp -> Rhs
HS.UnGuardedRhs (Exp -> Rhs) -> Exp -> Rhs
forall a b. (a -> b) -> a -> b
$ [Char] -> Exp
fakeExp [Char]
s) Maybe Binds
emptyBinds]
fakeDS :: String -> String -> HS.Decl
fakeDS :: [Char] -> [Char] -> Decl
fakeDS = Name -> [Char] -> Decl
fakeD (Name -> [Char] -> Decl)
-> ([Char] -> Name) -> [Char] -> [Char] -> Decl
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Name
HS.Ident
fakeDQ :: QName -> String -> HS.Decl
fakeDQ :: QName -> [Char] -> Decl
fakeDQ = Name -> [Char] -> Decl
fakeD (Name -> [Char] -> Decl)
-> (QName -> Name) -> QName -> [Char] -> Decl
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QName -> Name
dname
fakeType :: String -> HS.Type
fakeType :: [Char] -> Type
fakeType = [Char] -> Type
HS.FakeType
fakeExp :: String -> HS.Exp
fakeExp :: [Char] -> Exp
fakeExp = [Char] -> Exp
HS.FakeExp
fakeDecl :: String -> HS.Decl
fakeDecl :: [Char] -> Decl
fakeDecl = [Char] -> Decl
HS.FakeDecl
emptyBinds :: Maybe HS.Binds
emptyBinds :: Maybe Binds
emptyBinds = Maybe Binds
forall a. Maybe a
Nothing
isModChar :: Char -> Bool
isModChar :: Char -> Bool
isModChar Char
c =
Char -> Bool
isLower Char
c Bool -> Bool -> Bool
|| Char -> Bool
isUpper Char
c Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\''