{-# LANGUAGE CPP #-}
module Curry.Base.Ident
(
ModuleIdent (..), mkMIdent, moduleName, escModuleName
, fromModuleName, isValidModuleName, addPositionModuleIdent, mIdentLength
, Ident (..), mkIdent, showIdent, escName, identSupply
, globalScope, hasGlobalScope, isRenamed, renameIdent, unRenameIdent
, updIdentName, addPositionIdent, isInfixOp, identLength
, QualIdent (..), qualName, escQualName, isQInfixOp, qualify
, qualifyWith, qualQualify, qualifyLike, isQualified, unqualify, qualUnqualify
, localIdent, isLocalIdent, updQualIdent, qIdentLength
, emptyMIdent, mainMIdent, preludeMIdent
, arrowId, unitId, boolId, charId, intId, floatId, listId, ioId, successId
, eqId, ordId, enumId, boundedId, readId, showId
, numId, fractionalId
, monadId, monadFailId
, dataId
, trueId, falseId, nilId, consId, tupleId, isTupleId, tupleArity
, mainId, minusId, fminusId, applyId, errorId, failedId, idId
, succId, predId, toEnumId, fromEnumId, enumFromId, enumFromThenId
, enumFromToId, enumFromThenToId
, maxBoundId, minBoundId
, lexId, readsPrecId, readParenId
, showsPrecId, showParenId, showStringId
, andOpId, eqOpId, leqOpId, ltOpId, orOpId, appendOpId, dotOpId
, aValueId, dataEqId
, anonId, isAnonId
, qArrowId, qUnitId, qBoolId, qCharId, qIntId, qFloatId, qListId, qIOId
, qSuccessId, isPrimTypeId
, qEqId, qOrdId, qEnumId, qBoundedId, qReadId, qShowId
, qNumId, qFractionalId
, qMonadId, qMonadFailId
, qDataId
, qTrueId, qFalseId, qNilId, qConsId, qTupleId, isQTupleId, qTupleArity
, qApplyId, qErrorId, qFailedId, qIdId
, qFromEnumId, qEnumFromId, qEnumFromThenId, qEnumFromToId, qEnumFromThenToId
, qMaxBoundId, qMinBoundId
, qLexId, qReadsPrecId, qReadParenId
, qShowsPrecId, qShowParenId, qShowStringId
, qAndOpId, qEqOpId, qLeqOpId, qLtOpId, qOrOpId, qAppendOpId, qDotOpId
, qAValueId, qDataEqId
, fpSelectorId, isFpSelectorId, isQualFpSelectorId
, recSelectorId, qualRecSelectorId, recUpdateId, qualRecUpdateId
, recordExt, recordExtId, isRecordExtId, fromRecordExtId
, labelExt, labelExtId, isLabelExtId, fromLabelExtId
, renameLabel, mkLabelIdent
) where
import Prelude hiding ((<>))
import Data.Char (isAlpha, isAlphaNum)
import Data.Function (on)
import Data.List (intercalate, isInfixOf, isPrefixOf)
import Data.Maybe (isJust, fromMaybe)
import Data.Binary
import Control.Monad
import Curry.Base.Position
import Curry.Base.Span hiding (file)
import Curry.Base.SpanInfo
import Curry.Base.Pretty
data ModuleIdent = ModuleIdent
{ ModuleIdent -> SpanInfo
midSpanInfo :: SpanInfo
, ModuleIdent -> [String]
midQualifiers :: [String]
} deriving (ReadPrec [ModuleIdent]
ReadPrec ModuleIdent
Int -> ReadS ModuleIdent
ReadS [ModuleIdent]
(Int -> ReadS ModuleIdent)
-> ReadS [ModuleIdent]
-> ReadPrec ModuleIdent
-> ReadPrec [ModuleIdent]
-> Read ModuleIdent
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ModuleIdent]
$creadListPrec :: ReadPrec [ModuleIdent]
readPrec :: ReadPrec ModuleIdent
$creadPrec :: ReadPrec ModuleIdent
readList :: ReadS [ModuleIdent]
$creadList :: ReadS [ModuleIdent]
readsPrec :: Int -> ReadS ModuleIdent
$creadsPrec :: Int -> ReadS ModuleIdent
Read, Int -> ModuleIdent -> ShowS
[ModuleIdent] -> ShowS
ModuleIdent -> String
(Int -> ModuleIdent -> ShowS)
-> (ModuleIdent -> String)
-> ([ModuleIdent] -> ShowS)
-> Show ModuleIdent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModuleIdent] -> ShowS
$cshowList :: [ModuleIdent] -> ShowS
show :: ModuleIdent -> String
$cshow :: ModuleIdent -> String
showsPrec :: Int -> ModuleIdent -> ShowS
$cshowsPrec :: Int -> ModuleIdent -> ShowS
Show)
instance Eq ModuleIdent where
== :: ModuleIdent -> ModuleIdent -> Bool
(==) = [String] -> [String] -> Bool
forall a. Eq a => a -> a -> Bool
(==) ([String] -> [String] -> Bool)
-> (ModuleIdent -> [String]) -> ModuleIdent -> ModuleIdent -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` ModuleIdent -> [String]
midQualifiers
instance Ord ModuleIdent where
compare :: ModuleIdent -> ModuleIdent -> Ordering
compare = [String] -> [String] -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([String] -> [String] -> Ordering)
-> (ModuleIdent -> [String])
-> ModuleIdent
-> ModuleIdent
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` ModuleIdent -> [String]
midQualifiers
instance HasSpanInfo ModuleIdent where
getSpanInfo :: ModuleIdent -> SpanInfo
getSpanInfo = ModuleIdent -> SpanInfo
midSpanInfo
setSpanInfo :: SpanInfo -> ModuleIdent -> ModuleIdent
setSpanInfo spi :: SpanInfo
spi a :: ModuleIdent
a = ModuleIdent
a { midSpanInfo :: SpanInfo
midSpanInfo = SpanInfo
spi }
updateEndPos :: ModuleIdent -> ModuleIdent
updateEndPos i :: ModuleIdent
i =
Position -> ModuleIdent -> ModuleIdent
forall a. HasSpanInfo a => Position -> a -> a
setEndPosition (Position -> Int -> Position
incr (ModuleIdent -> Position
forall a. HasPosition a => a -> Position
getPosition ModuleIdent
i) (ModuleIdent -> Int
mIdentLength ModuleIdent
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)) ModuleIdent
i
instance HasPosition ModuleIdent where
getPosition :: ModuleIdent -> Position
getPosition = ModuleIdent -> Position
forall a. HasSpanInfo a => a -> Position
getStartPosition
setPosition :: Position -> ModuleIdent -> ModuleIdent
setPosition = Position -> ModuleIdent -> ModuleIdent
forall a. HasSpanInfo a => Position -> a -> a
setStartPosition
instance Pretty ModuleIdent where
pPrint :: ModuleIdent -> Doc
pPrint = [Doc] -> Doc
hcat ([Doc] -> Doc) -> (ModuleIdent -> [Doc]) -> ModuleIdent -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> [Doc] -> [Doc]
punctuate Doc
dot ([Doc] -> [Doc]) -> (ModuleIdent -> [Doc]) -> ModuleIdent -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Doc) -> [String] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map String -> Doc
text ([String] -> [Doc])
-> (ModuleIdent -> [String]) -> ModuleIdent -> [Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleIdent -> [String]
midQualifiers
instance Binary ModuleIdent where
put :: ModuleIdent -> Put
put (ModuleIdent sp :: SpanInfo
sp qs :: [String]
qs) = SpanInfo -> Put
forall t. Binary t => t -> Put
put SpanInfo
sp Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [String] -> Put
forall t. Binary t => t -> Put
put [String]
qs
get :: Get ModuleIdent
get = (SpanInfo -> [String] -> ModuleIdent)
-> Get SpanInfo -> Get [String] -> Get ModuleIdent
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 SpanInfo -> [String] -> ModuleIdent
ModuleIdent Get SpanInfo
forall t. Binary t => Get t
get Get [String]
forall t. Binary t => Get t
get
mIdentLength :: ModuleIdent -> Int
mIdentLength :: ModuleIdent -> Int
mIdentLength a :: ModuleIdent
a = String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (ModuleIdent -> [String]
midQualifiers ModuleIdent
a))
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (ModuleIdent -> [String]
midQualifiers ModuleIdent
a)
mkMIdent :: [String] -> ModuleIdent
mkMIdent :: [String] -> ModuleIdent
mkMIdent = SpanInfo -> [String] -> ModuleIdent
ModuleIdent SpanInfo
NoSpanInfo
moduleName :: ModuleIdent -> String
moduleName :: ModuleIdent -> String
moduleName = String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate "." ([String] -> String)
-> (ModuleIdent -> [String]) -> ModuleIdent -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleIdent -> [String]
midQualifiers
escModuleName :: ModuleIdent -> String
escModuleName :: ModuleIdent -> String
escModuleName m :: ModuleIdent
m = '`' Char -> ShowS
forall a. a -> [a] -> [a]
: ModuleIdent -> String
moduleName ModuleIdent
m String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
addPositionModuleIdent :: Position -> ModuleIdent -> ModuleIdent
addPositionModuleIdent :: Position -> ModuleIdent -> ModuleIdent
addPositionModuleIdent = Position -> ModuleIdent -> ModuleIdent
forall a. HasPosition a => Position -> a -> a
setPosition
isValidModuleName :: String -> Bool
isValidModuleName :: String -> Bool
isValidModuleName [] = Bool
False
isValidModuleName qs :: String
qs = (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all String -> Bool
isModuleIdentifier ([String] -> Bool) -> [String] -> Bool
forall a b. (a -> b) -> a -> b
$ String -> [String]
splitIdentifiers String
qs
where
isModuleIdentifier :: String -> Bool
isModuleIdentifier [] = Bool
False
isModuleIdentifier (c :: Char
c:cs :: String
cs) = Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
&& (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isIdent String
cs
isIdent :: Char -> Bool
isIdent c :: Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` "'_"
fromModuleName :: String -> ModuleIdent
fromModuleName :: String -> ModuleIdent
fromModuleName = [String] -> ModuleIdent
mkMIdent ([String] -> ModuleIdent)
-> (String -> [String]) -> String -> ModuleIdent
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
splitIdentifiers
splitIdentifiers :: String -> [String]
splitIdentifiers :: String -> [String]
splitIdentifiers s :: String
s = let (pref :: String
pref, rest :: String
rest) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '.') String
s in
String
pref String -> [String] -> [String]
forall a. a -> [a] -> [a]
: case String
rest of
[] -> []
(_:s' :: String
s') -> String -> [String]
splitIdentifiers String
s'
data Ident = Ident
{ Ident -> SpanInfo
idSpanInfo :: SpanInfo
, Ident -> String
idName :: String
, Ident -> Integer
idUnique :: Integer
} deriving (ReadPrec [Ident]
ReadPrec Ident
Int -> ReadS Ident
ReadS [Ident]
(Int -> ReadS Ident)
-> ReadS [Ident]
-> ReadPrec Ident
-> ReadPrec [Ident]
-> Read Ident
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Ident]
$creadListPrec :: ReadPrec [Ident]
readPrec :: ReadPrec Ident
$creadPrec :: ReadPrec Ident
readList :: ReadS [Ident]
$creadList :: ReadS [Ident]
readsPrec :: Int -> ReadS Ident
$creadsPrec :: Int -> ReadS Ident
Read, Int -> Ident -> ShowS
[Ident] -> ShowS
Ident -> String
(Int -> Ident -> ShowS)
-> (Ident -> String) -> ([Ident] -> ShowS) -> Show Ident
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Ident] -> ShowS
$cshowList :: [Ident] -> ShowS
show :: Ident -> String
$cshow :: Ident -> String
showsPrec :: Int -> Ident -> ShowS
$cshowsPrec :: Int -> Ident -> ShowS
Show)
instance Eq Ident where
Ident _ m :: String
m i :: Integer
i == :: Ident -> Ident -> Bool
== Ident _ n :: String
n j :: Integer
j = (String
m, Integer
i) (String, Integer) -> (String, Integer) -> Bool
forall a. Eq a => a -> a -> Bool
== (String
n, Integer
j)
instance Ord Ident where
Ident _ m :: String
m i :: Integer
i compare :: Ident -> Ident -> Ordering
`compare` Ident _ n :: String
n j :: Integer
j = (String
m, Integer
i) (String, Integer) -> (String, Integer) -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` (String
n, Integer
j)
instance HasSpanInfo Ident where
getSpanInfo :: Ident -> SpanInfo
getSpanInfo = Ident -> SpanInfo
idSpanInfo
setSpanInfo :: SpanInfo -> Ident -> Ident
setSpanInfo spi :: SpanInfo
spi a :: Ident
a = Ident
a { idSpanInfo :: SpanInfo
idSpanInfo = SpanInfo
spi }
updateEndPos :: Ident -> Ident
updateEndPos i :: Ident
i@(Ident (SpanInfo _ [_,ss :: Span
ss]) _ _) =
Position -> Ident -> Ident
forall a. HasSpanInfo a => Position -> a -> a
setEndPosition (Span -> Position
end Span
ss) Ident
i
updateEndPos i :: Ident
i =
Position -> Ident -> Ident
forall a. HasSpanInfo a => Position -> a -> a
setEndPosition (Position -> Int -> Position
incr (Ident -> Position
forall a. HasPosition a => a -> Position
getPosition Ident
i) (Ident -> Int
identLength Ident
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)) Ident
i
instance HasPosition Ident where
getPosition :: Ident -> Position
getPosition = Ident -> Position
forall a. HasSpanInfo a => a -> Position
getStartPosition
setPosition :: Position -> Ident -> Ident
setPosition = Position -> Ident -> Ident
forall a. HasSpanInfo a => Position -> a -> a
setStartPosition
instance Pretty Ident where
pPrint :: Ident -> Doc
pPrint (Ident _ x :: String
x n :: Integer
n) | Integer
n Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
globalScope = String -> Doc
text String
x
| Bool
otherwise = String -> Doc
text String
x Doc -> Doc -> Doc
<> Doc
dot Doc -> Doc -> Doc
<> Integer -> Doc
integer Integer
n
instance Binary Ident where
put :: Ident -> Put
put (Ident sp :: SpanInfo
sp qs :: String
qs i :: Integer
i) = SpanInfo -> Put
forall t. Binary t => t -> Put
put SpanInfo
sp Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> Put
forall t. Binary t => t -> Put
put String
qs Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Integer -> Put
forall t. Binary t => t -> Put
put Integer
i
get :: Get Ident
get = (SpanInfo -> String -> Integer -> Ident)
-> Get SpanInfo -> Get String -> Get Integer -> Get Ident
forall (m :: * -> *) a1 a2 a3 r.
Monad m =>
(a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 SpanInfo -> String -> Integer -> Ident
Ident Get SpanInfo
forall t. Binary t => Get t
get Get String
forall t. Binary t => Get t
get Get Integer
forall t. Binary t => Get t
get
identLength :: Ident -> Int
identLength :: Ident -> Int
identLength a :: Ident
a = String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (Ident -> String
idName Ident
a)
globalScope :: Integer
globalScope :: Integer
globalScope = 0
mkIdent :: String -> Ident
mkIdent :: String -> Ident
mkIdent x :: String
x = SpanInfo -> String -> Integer -> Ident
Ident SpanInfo
NoSpanInfo String
x Integer
globalScope
identSupply :: [Ident]
identSupply :: [Ident]
identSupply = [ Char -> Integer -> Ident
forall a. (Eq a, Num a, Show a) => Char -> a -> Ident
mkNewIdent Char
c Integer
i | Integer
i <- [0 ..] :: [Integer], Char
c <- ['a'..'z'] ]
where mkNewIdent :: Char -> a -> Ident
mkNewIdent c :: Char
c 0 = String -> Ident
mkIdent [Char
c]
mkNewIdent c :: Char
c n :: a
n = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: a -> String
forall a. Show a => a -> String
show a
n
showIdent :: Ident -> String
showIdent :: Ident -> String
showIdent (Ident _ x :: String
x n :: Integer
n) | Integer
n Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
globalScope = String
x
| Bool
otherwise = String
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ '.' Char -> ShowS
forall a. a -> [a] -> [a]
: Integer -> String
forall a. Show a => a -> String
show Integer
n
escName :: Ident -> String
escName :: Ident -> String
escName i :: Ident
i = '`' Char -> ShowS
forall a. a -> [a] -> [a]
: Ident -> String
idName Ident
i String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
hasGlobalScope :: Ident -> Bool
hasGlobalScope :: Ident -> Bool
hasGlobalScope = (Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
globalScope) (Integer -> Bool) -> (Ident -> Integer) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> Integer
idUnique
isRenamed :: Ident -> Bool
isRenamed :: Ident -> Bool
isRenamed = (Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= Integer
globalScope) (Integer -> Bool) -> (Ident -> Integer) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> Integer
idUnique
renameIdent :: Ident -> Integer -> Ident
renameIdent :: Ident -> Integer -> Ident
renameIdent ident :: Ident
ident n :: Integer
n = Ident
ident { idUnique :: Integer
idUnique = Integer
n }
unRenameIdent :: Ident -> Ident
unRenameIdent :: Ident -> Ident
unRenameIdent ident :: Ident
ident = Ident -> Integer -> Ident
renameIdent Ident
ident Integer
globalScope
updIdentName :: (String -> String) -> Ident -> Ident
updIdentName :: ShowS -> Ident -> Ident
updIdentName f :: ShowS
f (Ident p :: SpanInfo
p n :: String
n i :: Integer
i) = SpanInfo -> String -> Integer -> Ident
Ident SpanInfo
p (ShowS
f String
n) Integer
i
addPositionIdent :: Position -> Ident -> Ident
addPositionIdent :: Position -> Ident -> Ident
addPositionIdent = Position -> Ident -> Ident
forall a. HasPosition a => Position -> a -> a
setPosition
isInfixOp :: Ident -> Bool
isInfixOp :: Ident -> Bool
isInfixOp (Ident _ ('<' : c :: Char
c : cs :: String
cs) _) =
String -> Char
forall a. [a] -> a
last (Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: String
cs) Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '>' Bool -> Bool -> Bool
|| Bool -> Bool
not (Char -> Bool
isAlphaNum Char
c) Bool -> Bool -> Bool
&& Char
c Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` "_(["
isInfixOp (Ident _ (c :: Char
c : _) _) = Bool -> Bool
not (Char -> Bool
isAlphaNum Char
c) Bool -> Bool -> Bool
&& Char
c Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` "_(["
isInfixOp Ident{} = Bool
False
data QualIdent = QualIdent
{ QualIdent -> SpanInfo
qidSpanInfo :: SpanInfo
, QualIdent -> Maybe ModuleIdent
qidModule :: Maybe ModuleIdent
, QualIdent -> Ident
qidIdent :: Ident
} deriving (ReadPrec [QualIdent]
ReadPrec QualIdent
Int -> ReadS QualIdent
ReadS [QualIdent]
(Int -> ReadS QualIdent)
-> ReadS [QualIdent]
-> ReadPrec QualIdent
-> ReadPrec [QualIdent]
-> Read QualIdent
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [QualIdent]
$creadListPrec :: ReadPrec [QualIdent]
readPrec :: ReadPrec QualIdent
$creadPrec :: ReadPrec QualIdent
readList :: ReadS [QualIdent]
$creadList :: ReadS [QualIdent]
readsPrec :: Int -> ReadS QualIdent
$creadsPrec :: Int -> ReadS QualIdent
Read, Int -> QualIdent -> ShowS
[QualIdent] -> ShowS
QualIdent -> String
(Int -> QualIdent -> ShowS)
-> (QualIdent -> String)
-> ([QualIdent] -> ShowS)
-> Show QualIdent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QualIdent] -> ShowS
$cshowList :: [QualIdent] -> ShowS
show :: QualIdent -> String
$cshow :: QualIdent -> String
showsPrec :: Int -> QualIdent -> ShowS
$cshowsPrec :: Int -> QualIdent -> ShowS
Show)
instance Eq QualIdent where
QualIdent _ m :: Maybe ModuleIdent
m i :: Ident
i == :: QualIdent -> QualIdent -> Bool
== QualIdent _ n :: Maybe ModuleIdent
n j :: Ident
j = (Maybe ModuleIdent
m, Ident
i) (Maybe ModuleIdent, Ident) -> (Maybe ModuleIdent, Ident) -> Bool
forall a. Eq a => a -> a -> Bool
== (Maybe ModuleIdent
n, Ident
j)
instance Ord QualIdent where
QualIdent _ m :: Maybe ModuleIdent
m i :: Ident
i compare :: QualIdent -> QualIdent -> Ordering
`compare` QualIdent _ n :: Maybe ModuleIdent
n j :: Ident
j = (Maybe ModuleIdent
m, Ident
i) (Maybe ModuleIdent, Ident)
-> (Maybe ModuleIdent, Ident) -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` (Maybe ModuleIdent
n, Ident
j)
instance HasSpanInfo QualIdent where
getSpanInfo :: QualIdent -> SpanInfo
getSpanInfo = QualIdent -> SpanInfo
qidSpanInfo
setSpanInfo :: SpanInfo -> QualIdent -> QualIdent
setSpanInfo spi :: SpanInfo
spi a :: QualIdent
a = QualIdent
a { qidSpanInfo :: SpanInfo
qidSpanInfo = SpanInfo
spi }
updateEndPos :: QualIdent -> QualIdent
updateEndPos i :: QualIdent
i@(QualIdent (SpanInfo _ [_,ss :: Span
ss]) _ _) =
Position -> QualIdent -> QualIdent
forall a. HasSpanInfo a => Position -> a -> a
setEndPosition (Span -> Position
end Span
ss) QualIdent
i
updateEndPos i :: QualIdent
i =
Position -> QualIdent -> QualIdent
forall a. HasSpanInfo a => Position -> a -> a
setEndPosition (Position -> Int -> Position
incr (QualIdent -> Position
forall a. HasPosition a => a -> Position
getPosition QualIdent
i) (QualIdent -> Int
qIdentLength QualIdent
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)) QualIdent
i
instance HasPosition QualIdent where
getPosition :: QualIdent -> Position
getPosition = QualIdent -> Position
forall a. HasSpanInfo a => a -> Position
getStartPosition
setPosition :: Position -> QualIdent -> QualIdent
setPosition = Position -> QualIdent -> QualIdent
forall a. HasSpanInfo a => Position -> a -> a
setStartPosition
instance Pretty QualIdent where
pPrint :: QualIdent -> Doc
pPrint = String -> Doc
text (String -> Doc) -> (QualIdent -> String) -> QualIdent -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> String
qualName
instance Binary QualIdent where
put :: QualIdent -> Put
put (QualIdent sp :: SpanInfo
sp mid :: Maybe ModuleIdent
mid idt :: Ident
idt) = SpanInfo -> Put
forall t. Binary t => t -> Put
put SpanInfo
sp Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Maybe ModuleIdent -> Put
forall t. Binary t => t -> Put
put Maybe ModuleIdent
mid Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ident -> Put
forall t. Binary t => t -> Put
put Ident
idt
get :: Get QualIdent
get = (SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent)
-> Get SpanInfo
-> Get (Maybe ModuleIdent)
-> Get Ident
-> Get QualIdent
forall (m :: * -> *) a1 a2 a3 r.
Monad m =>
(a1 -> a2 -> a3 -> r) -> m a1 -> m a2 -> m a3 -> m r
liftM3 SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
QualIdent Get SpanInfo
forall t. Binary t => Get t
get Get (Maybe ModuleIdent)
forall t. Binary t => Get t
get Get Ident
forall t. Binary t => Get t
get
qIdentLength :: QualIdent -> Int
qIdentLength :: QualIdent -> Int
qIdentLength (QualIdent _ (Just m :: ModuleIdent
m) i :: Ident
i) = Ident -> Int
identLength Ident
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ ModuleIdent -> Int
mIdentLength ModuleIdent
m
qIdentLength (QualIdent _ Nothing i :: Ident
i) = Ident -> Int
identLength Ident
i
qualName :: QualIdent -> String
qualName :: QualIdent -> String
qualName (QualIdent _ Nothing x :: Ident
x) = Ident -> String
idName Ident
x
qualName (QualIdent _ (Just m :: ModuleIdent
m) x :: Ident
x) = ModuleIdent -> String
moduleName ModuleIdent
m String -> ShowS
forall a. [a] -> [a] -> [a]
++ "." String -> ShowS
forall a. [a] -> [a] -> [a]
++ Ident -> String
idName Ident
x
escQualName :: QualIdent -> String
escQualName :: QualIdent -> String
escQualName qn :: QualIdent
qn = '`' Char -> ShowS
forall a. a -> [a] -> [a]
: QualIdent -> String
qualName QualIdent
qn String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
isQInfixOp :: QualIdent -> Bool
isQInfixOp :: QualIdent -> Bool
isQInfixOp = Ident -> Bool
isInfixOp (Ident -> Bool) -> (QualIdent -> Ident) -> QualIdent -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> Ident
qidIdent
qualify :: Ident -> QualIdent
qualify :: Ident -> QualIdent
qualify i :: Ident
i = SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
QualIdent (Span -> SpanInfo
fromSrcSpan (Ident -> Span
forall a. HasSpanInfo a => a -> Span
getSrcSpan Ident
i)) Maybe ModuleIdent
forall a. Maybe a
Nothing Ident
i
qualifyWith :: ModuleIdent -> Ident -> QualIdent
qualifyWith :: ModuleIdent -> Ident -> QualIdent
qualifyWith mid :: ModuleIdent
mid i :: Ident
i = QualIdent -> QualIdent
forall a. HasSpanInfo a => a -> a
updateEndPos (QualIdent -> QualIdent) -> QualIdent -> QualIdent
forall a b. (a -> b) -> a -> b
$
SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
QualIdent (Span -> SpanInfo
fromSrcSpan (ModuleIdent -> Span
forall a. HasSpanInfo a => a -> Span
getSrcSpan ModuleIdent
mid)) (ModuleIdent -> Maybe ModuleIdent
forall a. a -> Maybe a
Just ModuleIdent
mid) Ident
i
qualQualify :: ModuleIdent -> QualIdent -> QualIdent
qualQualify :: ModuleIdent -> QualIdent -> QualIdent
qualQualify m :: ModuleIdent
m (QualIdent _ Nothing x :: Ident
x) = ModuleIdent -> Ident -> QualIdent
qualifyWith ModuleIdent
m Ident
x
qualQualify _ x :: QualIdent
x = QualIdent
x
qualifyLike :: QualIdent -> Ident -> QualIdent
qualifyLike :: QualIdent -> Ident -> QualIdent
qualifyLike (QualIdent _ Nothing _) x :: Ident
x = Ident -> QualIdent
qualify Ident
x
qualifyLike (QualIdent _ (Just m :: ModuleIdent
m) _) x :: Ident
x = ModuleIdent -> Ident -> QualIdent
qualifyWith ModuleIdent
m Ident
x
isQualified :: QualIdent -> Bool
isQualified :: QualIdent -> Bool
isQualified = Maybe ModuleIdent -> Bool
forall a. Maybe a -> Bool
isJust (Maybe ModuleIdent -> Bool)
-> (QualIdent -> Maybe ModuleIdent) -> QualIdent -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> Maybe ModuleIdent
qidModule
unqualify :: QualIdent -> Ident
unqualify :: QualIdent -> Ident
unqualify = QualIdent -> Ident
qidIdent
qualUnqualify :: ModuleIdent -> QualIdent -> QualIdent
qualUnqualify :: ModuleIdent -> QualIdent -> QualIdent
qualUnqualify _ qid :: QualIdent
qid@(QualIdent _ Nothing _) = QualIdent
qid
qualUnqualify m :: ModuleIdent
m (QualIdent spi :: SpanInfo
spi (Just m' :: ModuleIdent
m') x :: Ident
x) = SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
QualIdent SpanInfo
spi Maybe ModuleIdent
m'' Ident
x
where m'' :: Maybe ModuleIdent
m'' | ModuleIdent
m ModuleIdent -> ModuleIdent -> Bool
forall a. Eq a => a -> a -> Bool
== ModuleIdent
m' = Maybe ModuleIdent
forall a. Maybe a
Nothing
| Bool
otherwise = ModuleIdent -> Maybe ModuleIdent
forall a. a -> Maybe a
Just ModuleIdent
m'
localIdent :: ModuleIdent -> QualIdent -> Maybe Ident
localIdent :: ModuleIdent -> QualIdent -> Maybe Ident
localIdent _ (QualIdent _ Nothing x :: Ident
x) = Ident -> Maybe Ident
forall a. a -> Maybe a
Just Ident
x
localIdent m :: ModuleIdent
m (QualIdent _ (Just m' :: ModuleIdent
m') x :: Ident
x)
| ModuleIdent
m ModuleIdent -> ModuleIdent -> Bool
forall a. Eq a => a -> a -> Bool
== ModuleIdent
m' = Ident -> Maybe Ident
forall a. a -> Maybe a
Just Ident
x
| Bool
otherwise = Maybe Ident
forall a. Maybe a
Nothing
isLocalIdent :: ModuleIdent -> QualIdent -> Bool
isLocalIdent :: ModuleIdent -> QualIdent -> Bool
isLocalIdent mid :: ModuleIdent
mid qid :: QualIdent
qid = Maybe Ident -> Bool
forall a. Maybe a -> Bool
isJust (ModuleIdent -> QualIdent -> Maybe Ident
localIdent ModuleIdent
mid QualIdent
qid)
updQualIdent :: (ModuleIdent -> ModuleIdent) -> (Ident -> Ident)
-> QualIdent -> QualIdent
updQualIdent :: (ModuleIdent -> ModuleIdent)
-> (Ident -> Ident) -> QualIdent -> QualIdent
updQualIdent f :: ModuleIdent -> ModuleIdent
f g :: Ident -> Ident
g (QualIdent spi :: SpanInfo
spi m :: Maybe ModuleIdent
m x :: Ident
x) = SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
QualIdent SpanInfo
spi ((ModuleIdent -> ModuleIdent)
-> Maybe ModuleIdent -> Maybe ModuleIdent
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ModuleIdent -> ModuleIdent
f Maybe ModuleIdent
m) (Ident -> Ident
g Ident
x)
emptyMIdent :: ModuleIdent
emptyMIdent :: ModuleIdent
emptyMIdent = SpanInfo -> [String] -> ModuleIdent
ModuleIdent SpanInfo
NoSpanInfo []
mainMIdent :: ModuleIdent
mainMIdent :: ModuleIdent
mainMIdent = SpanInfo -> [String] -> ModuleIdent
ModuleIdent SpanInfo
NoSpanInfo ["main"]
preludeMIdent :: ModuleIdent
preludeMIdent :: ModuleIdent
preludeMIdent = SpanInfo -> [String] -> ModuleIdent
ModuleIdent SpanInfo
NoSpanInfo ["Prelude"]
arrowId :: Ident
arrowId :: Ident
arrowId = String -> Ident
mkIdent "(->)"
unitId :: Ident
unitId :: Ident
unitId = String -> Ident
mkIdent "()"
boolId :: Ident
boolId :: Ident
boolId = String -> Ident
mkIdent "Bool"
charId :: Ident
charId :: Ident
charId = String -> Ident
mkIdent "Char"
intId :: Ident
intId :: Ident
intId = String -> Ident
mkIdent "Int"
floatId :: Ident
floatId :: Ident
floatId = String -> Ident
mkIdent "Float"
listId :: Ident
listId :: Ident
listId = String -> Ident
mkIdent "[]"
ioId :: Ident
ioId :: Ident
ioId = String -> Ident
mkIdent "IO"
successId :: Ident
successId :: Ident
successId = String -> Ident
mkIdent "Success"
tupleId :: Int -> Ident
tupleId :: Int -> Ident
tupleId n :: Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ '(' Char -> ShowS
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1) ',' String -> ShowS
forall a. [a] -> [a] -> [a]
++ ")"
| Bool
otherwise = String -> Ident
forall a. HasCallStack => String -> a
error (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ "Curry.Base.Ident.tupleId: wrong arity " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
isTupleId :: Ident -> Bool
isTupleId :: Ident -> Bool
isTupleId (Ident _ x :: String
x _) = Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 1 Bool -> Bool -> Bool
&& String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== Ident -> String
idName (Int -> Ident
tupleId Int
n)
where n :: Int
n = String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
tupleArity :: Ident -> Int
tupleArity :: Ident -> Int
tupleArity i :: Ident
i@(Ident _ x :: String
x _)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 1 Bool -> Bool -> Bool
&& String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== Ident -> String
idName (Int -> Ident
tupleId Int
n) = Int
n
| Bool
otherwise = String -> Int
forall a. HasCallStack => String -> a
error (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$
"Curry.Base.Ident.tupleArity: no tuple identifier: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Ident -> String
showIdent Ident
i
where n :: Int
n = String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
eqId :: Ident
eqId :: Ident
eqId = String -> Ident
mkIdent "Eq"
ordId :: Ident
ordId :: Ident
ordId = String -> Ident
mkIdent "Ord"
enumId :: Ident
enumId :: Ident
enumId = String -> Ident
mkIdent "Enum"
boundedId :: Ident
boundedId :: Ident
boundedId = String -> Ident
mkIdent "Bounded"
readId :: Ident
readId :: Ident
readId = String -> Ident
mkIdent "Read"
showId :: Ident
showId :: Ident
showId = String -> Ident
mkIdent "Show"
numId :: Ident
numId :: Ident
numId = String -> Ident
mkIdent "Num"
fractionalId :: Ident
fractionalId :: Ident
fractionalId = String -> Ident
mkIdent "Fractional"
monadId :: Ident
monadId :: Ident
monadId = String -> Ident
mkIdent "Monad"
monadFailId :: Ident
monadFailId :: Ident
monadFailId = String -> Ident
mkIdent "MonadFail"
dataId :: Ident
dataId :: Ident
dataId = String -> Ident
mkIdent "Data"
trueId :: Ident
trueId :: Ident
trueId = String -> Ident
mkIdent "True"
falseId :: Ident
falseId :: Ident
falseId = String -> Ident
mkIdent "False"
nilId :: Ident
nilId :: Ident
nilId = String -> Ident
mkIdent "[]"
consId :: Ident
consId :: Ident
consId = String -> Ident
mkIdent ":"
mainId :: Ident
mainId :: Ident
mainId = String -> Ident
mkIdent "main"
minusId :: Ident
minusId :: Ident
minusId = String -> Ident
mkIdent "-"
fminusId :: Ident
fminusId :: Ident
fminusId = String -> Ident
mkIdent "-."
applyId :: Ident
applyId :: Ident
applyId = String -> Ident
mkIdent "apply"
errorId :: Ident
errorId :: Ident
errorId = String -> Ident
mkIdent "error"
failedId :: Ident
failedId :: Ident
failedId = String -> Ident
mkIdent "failed"
idId :: Ident
idId :: Ident
idId = String -> Ident
mkIdent "id"
maxBoundId :: Ident
maxBoundId :: Ident
maxBoundId = String -> Ident
mkIdent "maxBound"
minBoundId :: Ident
minBoundId :: Ident
minBoundId = String -> Ident
mkIdent "minBound"
predId :: Ident
predId :: Ident
predId = String -> Ident
mkIdent "pred"
succId :: Ident
succId :: Ident
succId = String -> Ident
mkIdent "succ"
toEnumId :: Ident
toEnumId :: Ident
toEnumId = String -> Ident
mkIdent "toEnum"
fromEnumId :: Ident
= String -> Ident
mkIdent "fromEnum"
enumFromId :: Ident
enumFromId :: Ident
enumFromId = String -> Ident
mkIdent "enumFrom"
enumFromThenId :: Ident
enumFromThenId :: Ident
enumFromThenId = String -> Ident
mkIdent "enumFromThen"
enumFromToId :: Ident
enumFromToId :: Ident
enumFromToId = String -> Ident
mkIdent "enumFromTo"
enumFromThenToId :: Ident
enumFromThenToId :: Ident
enumFromThenToId = String -> Ident
mkIdent "enumFromThenTo"
lexId :: Ident
lexId :: Ident
lexId = String -> Ident
mkIdent "lex"
readsPrecId :: Ident
readsPrecId :: Ident
readsPrecId = String -> Ident
mkIdent "readsPrec"
readParenId :: Ident
readParenId :: Ident
readParenId = String -> Ident
mkIdent "readParen"
showsPrecId :: Ident
showsPrecId :: Ident
showsPrecId = String -> Ident
mkIdent "showsPrec"
showParenId :: Ident
showParenId :: Ident
showParenId = String -> Ident
mkIdent "showParen"
showStringId :: Ident
showStringId :: Ident
showStringId = String -> Ident
mkIdent "showString"
andOpId :: Ident
andOpId :: Ident
andOpId = String -> Ident
mkIdent "&&"
eqOpId :: Ident
eqOpId :: Ident
eqOpId = String -> Ident
mkIdent "=="
leqOpId :: Ident
leqOpId :: Ident
leqOpId = String -> Ident
mkIdent "<="
ltOpId :: Ident
ltOpId :: Ident
ltOpId = String -> Ident
mkIdent "<"
orOpId :: Ident
orOpId :: Ident
orOpId = String -> Ident
mkIdent "||"
appendOpId :: Ident
appendOpId :: Ident
appendOpId = String -> Ident
mkIdent "++"
dotOpId :: Ident
dotOpId :: Ident
dotOpId = String -> Ident
mkIdent "."
aValueId :: Ident
aValueId :: Ident
aValueId = String -> Ident
mkIdent "aValue"
dataEqId :: Ident
dataEqId :: Ident
dataEqId = String -> Ident
mkIdent "==="
anonId :: Ident
anonId :: Ident
anonId = String -> Ident
mkIdent "_"
isAnonId :: Ident -> Bool
isAnonId :: Ident -> Bool
isAnonId = (Ident -> Ident -> Bool
forall a. Eq a => a -> a -> Bool
== Ident
anonId) (Ident -> Bool) -> (Ident -> Ident) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> Ident
unRenameIdent
qPreludeIdent :: Ident -> QualIdent
qPreludeIdent :: Ident -> QualIdent
qPreludeIdent = ModuleIdent -> Ident -> QualIdent
qualifyWith ModuleIdent
preludeMIdent
qArrowId :: QualIdent
qArrowId :: QualIdent
qArrowId = Ident -> QualIdent
qualify Ident
arrowId
qUnitId :: QualIdent
qUnitId :: QualIdent
qUnitId = Ident -> QualIdent
qualify Ident
unitId
qListId :: QualIdent
qListId :: QualIdent
qListId = Ident -> QualIdent
qualify Ident
listId
qBoolId :: QualIdent
qBoolId :: QualIdent
qBoolId = Ident -> QualIdent
qPreludeIdent Ident
boolId
qCharId :: QualIdent
qCharId :: QualIdent
qCharId = Ident -> QualIdent
qPreludeIdent Ident
charId
qIntId :: QualIdent
qIntId :: QualIdent
qIntId = Ident -> QualIdent
qPreludeIdent Ident
intId
qFloatId :: QualIdent
qFloatId :: QualIdent
qFloatId = Ident -> QualIdent
qPreludeIdent Ident
floatId
qIOId :: QualIdent
qIOId :: QualIdent
qIOId = Ident -> QualIdent
qPreludeIdent Ident
ioId
qSuccessId :: QualIdent
qSuccessId :: QualIdent
qSuccessId = Ident -> QualIdent
qPreludeIdent Ident
successId
isPrimTypeId :: QualIdent -> Bool
isPrimTypeId :: QualIdent -> Bool
isPrimTypeId tc :: QualIdent
tc = QualIdent
tc QualIdent -> [QualIdent] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [QualIdent
qArrowId, QualIdent
qUnitId, QualIdent
qListId] Bool -> Bool -> Bool
|| QualIdent -> Bool
isQTupleId QualIdent
tc
qEqId :: QualIdent
qEqId :: QualIdent
qEqId = Ident -> QualIdent
qPreludeIdent Ident
eqId
qOrdId :: QualIdent
qOrdId :: QualIdent
qOrdId = Ident -> QualIdent
qPreludeIdent Ident
ordId
qEnumId :: QualIdent
qEnumId :: QualIdent
qEnumId = Ident -> QualIdent
qPreludeIdent Ident
enumId
qBoundedId :: QualIdent
qBoundedId :: QualIdent
qBoundedId = Ident -> QualIdent
qPreludeIdent Ident
boundedId
qReadId :: QualIdent
qReadId :: QualIdent
qReadId = Ident -> QualIdent
qPreludeIdent Ident
readId
qShowId :: QualIdent
qShowId :: QualIdent
qShowId = Ident -> QualIdent
qPreludeIdent Ident
showId
qNumId :: QualIdent
qNumId :: QualIdent
qNumId = Ident -> QualIdent
qPreludeIdent Ident
numId
qFractionalId :: QualIdent
qFractionalId :: QualIdent
qFractionalId = Ident -> QualIdent
qPreludeIdent Ident
fractionalId
qMonadId :: QualIdent
qMonadId :: QualIdent
qMonadId = Ident -> QualIdent
qPreludeIdent Ident
monadId
qMonadFailId :: QualIdent
qMonadFailId :: QualIdent
qMonadFailId = Ident -> QualIdent
qPreludeIdent Ident
monadFailId
qDataId :: QualIdent
qDataId :: QualIdent
qDataId = Ident -> QualIdent
qPreludeIdent Ident
dataId
qTrueId :: QualIdent
qTrueId :: QualIdent
qTrueId = Ident -> QualIdent
qPreludeIdent Ident
trueId
qFalseId :: QualIdent
qFalseId :: QualIdent
qFalseId = Ident -> QualIdent
qPreludeIdent Ident
falseId
qNilId :: QualIdent
qNilId :: QualIdent
qNilId = Ident -> QualIdent
qualify Ident
nilId
qConsId :: QualIdent
qConsId :: QualIdent
qConsId = Ident -> QualIdent
qualify Ident
consId
qTupleId :: Int -> QualIdent
qTupleId :: Int -> QualIdent
qTupleId = Ident -> QualIdent
qualify (Ident -> QualIdent) -> (Int -> Ident) -> Int -> QualIdent
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Ident
tupleId
isQTupleId :: QualIdent -> Bool
isQTupleId :: QualIdent -> Bool
isQTupleId = Ident -> Bool
isTupleId (Ident -> Bool) -> (QualIdent -> Ident) -> QualIdent -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> Ident
unqualify
qTupleArity :: QualIdent -> Int
qTupleArity :: QualIdent -> Int
qTupleArity = Ident -> Int
tupleArity (Ident -> Int) -> (QualIdent -> Ident) -> QualIdent -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> Ident
unqualify
qApplyId :: QualIdent
qApplyId :: QualIdent
qApplyId = Ident -> QualIdent
qPreludeIdent Ident
applyId
qErrorId :: QualIdent
qErrorId :: QualIdent
qErrorId = Ident -> QualIdent
qPreludeIdent Ident
errorId
qFailedId :: QualIdent
qFailedId :: QualIdent
qFailedId = Ident -> QualIdent
qPreludeIdent Ident
failedId
qIdId :: QualIdent
qIdId :: QualIdent
qIdId = Ident -> QualIdent
qPreludeIdent Ident
idId
qMaxBoundId :: QualIdent
qMaxBoundId :: QualIdent
qMaxBoundId = Ident -> QualIdent
qPreludeIdent Ident
maxBoundId
qMinBoundId :: QualIdent
qMinBoundId :: QualIdent
qMinBoundId = Ident -> QualIdent
qPreludeIdent Ident
minBoundId
qFromEnumId :: QualIdent
= Ident -> QualIdent
qPreludeIdent Ident
fromEnumId
qEnumFromId :: QualIdent
qEnumFromId :: QualIdent
qEnumFromId = Ident -> QualIdent
qPreludeIdent Ident
enumFromId
qEnumFromThenId :: QualIdent
qEnumFromThenId :: QualIdent
qEnumFromThenId = Ident -> QualIdent
qPreludeIdent Ident
enumFromThenId
qEnumFromToId :: QualIdent
qEnumFromToId :: QualIdent
qEnumFromToId = Ident -> QualIdent
qPreludeIdent Ident
enumFromToId
qEnumFromThenToId :: QualIdent
qEnumFromThenToId :: QualIdent
qEnumFromThenToId = Ident -> QualIdent
qPreludeIdent Ident
enumFromThenToId
qLexId :: QualIdent
qLexId :: QualIdent
qLexId = Ident -> QualIdent
qPreludeIdent Ident
lexId
qReadsPrecId :: QualIdent
qReadsPrecId :: QualIdent
qReadsPrecId = Ident -> QualIdent
qPreludeIdent Ident
readsPrecId
qReadParenId :: QualIdent
qReadParenId :: QualIdent
qReadParenId = Ident -> QualIdent
qPreludeIdent Ident
readParenId
qShowsPrecId :: QualIdent
qShowsPrecId :: QualIdent
qShowsPrecId = Ident -> QualIdent
qPreludeIdent Ident
showsPrecId
qShowParenId :: QualIdent
qShowParenId :: QualIdent
qShowParenId = Ident -> QualIdent
qPreludeIdent Ident
showParenId
qShowStringId :: QualIdent
qShowStringId :: QualIdent
qShowStringId = Ident -> QualIdent
qPreludeIdent Ident
showStringId
qAndOpId :: QualIdent
qAndOpId :: QualIdent
qAndOpId = Ident -> QualIdent
qPreludeIdent Ident
andOpId
qEqOpId :: QualIdent
qEqOpId :: QualIdent
qEqOpId = Ident -> QualIdent
qPreludeIdent Ident
eqOpId
qLeqOpId :: QualIdent
qLeqOpId :: QualIdent
qLeqOpId = Ident -> QualIdent
qPreludeIdent Ident
leqOpId
qLtOpId :: QualIdent
qLtOpId :: QualIdent
qLtOpId = Ident -> QualIdent
qPreludeIdent Ident
ltOpId
qOrOpId :: QualIdent
qOrOpId :: QualIdent
qOrOpId = Ident -> QualIdent
qPreludeIdent Ident
orOpId
qDotOpId :: QualIdent
qDotOpId :: QualIdent
qDotOpId = Ident -> QualIdent
qPreludeIdent Ident
dotOpId
qAValueId :: QualIdent
qAValueId :: QualIdent
qAValueId = Ident -> QualIdent
qPreludeIdent Ident
aValueId
qDataEqId :: QualIdent
qDataEqId :: QualIdent
qDataEqId = Ident -> QualIdent
qPreludeIdent Ident
dataEqId
qAppendOpId :: QualIdent
qAppendOpId :: QualIdent
qAppendOpId = Ident -> QualIdent
qPreludeIdent Ident
appendOpId
fpSelExt :: String
fpSelExt :: String
fpSelExt = "_#selFP"
fpSelectorId :: Int -> Ident
fpSelectorId :: Int -> Ident
fpSelectorId n :: Int
n = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ String
fpSelExt String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
isFpSelectorId :: Ident -> Bool
isFpSelectorId :: Ident -> Bool
isFpSelectorId = (String
fpSelExt String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf`) (String -> Bool) -> (Ident -> String) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> String
idName
isQualFpSelectorId :: QualIdent -> Bool
isQualFpSelectorId :: QualIdent -> Bool
isQualFpSelectorId = Ident -> Bool
isFpSelectorId (Ident -> Bool) -> (QualIdent -> Ident) -> QualIdent -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QualIdent -> Ident
unqualify
recSelExt :: String
recSelExt :: String
recSelExt = "_#selR@"
recSelectorId :: QualIdent
-> Ident
-> Ident
recSelectorId :: QualIdent -> Ident -> Ident
recSelectorId = String -> QualIdent -> Ident -> Ident
mkRecordId String
recSelExt
qualRecSelectorId :: ModuleIdent
-> QualIdent
-> Ident
-> QualIdent
qualRecSelectorId :: ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecSelectorId m :: ModuleIdent
m r :: QualIdent
r l :: Ident
l = ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecordId ModuleIdent
m QualIdent
r (Ident -> QualIdent) -> Ident -> QualIdent
forall a b. (a -> b) -> a -> b
$ QualIdent -> Ident -> Ident
recSelectorId QualIdent
r Ident
l
recUpdExt :: String
recUpdExt :: String
recUpdExt = "_#updR@"
recUpdateId :: QualIdent
-> Ident
-> Ident
recUpdateId :: QualIdent -> Ident -> Ident
recUpdateId = String -> QualIdent -> Ident -> Ident
mkRecordId String
recUpdExt
qualRecUpdateId :: ModuleIdent
-> QualIdent
-> Ident
-> QualIdent
qualRecUpdateId :: ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecUpdateId m :: ModuleIdent
m r :: QualIdent
r l :: Ident
l = ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecordId ModuleIdent
m QualIdent
r (Ident -> QualIdent) -> Ident -> QualIdent
forall a b. (a -> b) -> a -> b
$ QualIdent -> Ident -> Ident
recUpdateId QualIdent
r Ident
l
mkRecordId :: String -> QualIdent -> Ident -> Ident
mkRecordId :: String -> QualIdent -> Ident -> Ident
mkRecordId ann :: String
ann r :: QualIdent
r l :: Ident
l = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[String
ann, Ident -> String
idName (QualIdent -> Ident
unqualify QualIdent
r), ".", Ident -> String
idName Ident
l]
qualRecordId :: ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecordId :: ModuleIdent -> QualIdent -> Ident -> QualIdent
qualRecordId m :: ModuleIdent
m r :: QualIdent
r = ModuleIdent -> Ident -> QualIdent
qualifyWith (ModuleIdent -> Maybe ModuleIdent -> ModuleIdent
forall a. a -> Maybe a -> a
fromMaybe ModuleIdent
m (Maybe ModuleIdent -> ModuleIdent)
-> Maybe ModuleIdent -> ModuleIdent
forall a b. (a -> b) -> a -> b
$ QualIdent -> Maybe ModuleIdent
qidModule QualIdent
r)
recordExt :: String
recordExt :: String
recordExt = "_#Rec:"
recordExtId :: Ident -> Ident
recordExtId :: Ident -> Ident
recordExtId r :: Ident
r = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ String
recordExt String -> ShowS
forall a. [a] -> [a] -> [a]
++ Ident -> String
idName Ident
r
isRecordExtId :: Ident -> Bool
isRecordExtId :: Ident -> Bool
isRecordExtId = (String
recordExt String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) (String -> Bool) -> (Ident -> String) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> String
idName
fromRecordExtId :: Ident -> Ident
fromRecordExtId :: Ident -> Ident
fromRecordExtId r :: Ident
r
| String
p String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
recordExt = String -> Ident
mkIdent String
r'
| Bool
otherwise = Ident
r
where (p :: String
p, r' :: String
r') = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
recordExt) (Ident -> String
idName Ident
r)
labelExt :: String
labelExt :: String
labelExt = "_#Lab:"
labelExtId :: Ident -> Ident
labelExtId :: Ident -> Ident
labelExtId l :: Ident
l = String -> Ident
mkIdent (String -> Ident) -> String -> Ident
forall a b. (a -> b) -> a -> b
$ String
labelExt String -> ShowS
forall a. [a] -> [a] -> [a]
++ Ident -> String
idName Ident
l
isLabelExtId :: Ident -> Bool
isLabelExtId :: Ident -> Bool
isLabelExtId = (String
labelExt String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) (String -> Bool) -> (Ident -> String) -> Ident -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> String
idName
fromLabelExtId :: Ident -> Ident
fromLabelExtId :: Ident -> Ident
fromLabelExtId l :: Ident
l
| String
p String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
labelExt = String -> Ident
mkIdent String
l'
| Bool
otherwise = Ident
l
where (p :: String
p, l' :: String
l') = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
labelExt) (Ident -> String
idName Ident
l)
mkLabelIdent :: String -> Ident
mkLabelIdent :: String -> Ident
mkLabelIdent c :: String
c = Ident -> Integer -> Ident
renameIdent (String -> Ident
mkIdent String
c) (-1)
renameLabel :: Ident -> Ident
renameLabel :: Ident -> Ident
renameLabel l :: Ident
l = Ident -> Integer -> Ident
renameIdent Ident
l (-1)