{-# 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
, 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
, anonId, isAnonId
, qArrowId, qUnitId, qBoolId, qCharId, qIntId, qFloatId, qListId, qIOId
, qSuccessId, isPrimTypeId
, qEqId, qOrdId, qEnumId, qBoundedId, qReadId, qShowId
, qNumId, qFractionalId
, qMonadId
, 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
, fpSelectorId, isFpSelectorId, isQualFpSelectorId
, recSelectorId, qualRecSelectorId, recUpdateId, qualRecUpdateId
, recordExt, recordExtId, isRecordExtId, fromRecordExtId
, labelExt, labelExtId, isLabelExtId, fromLabelExtId
, renameLabel, mkLabelIdent
) where
#if __GLASGOW_HASKELL__ >= 804
import Prelude hiding ((<>))
#endif
import Data.Char (isAlpha, isAlphaNum)
import Data.Function (on)
import Data.List (intercalate, isInfixOf, isPrefixOf)
import Data.Maybe (isJust, fromMaybe)
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
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
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
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"
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 "."
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
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
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)