packages feed

hat-2.7.0.0: trans/TraceId.hs

module TraceId
  ( TraceId		-- abstract type
  , Fixity(L,R,Pre,Def,None)
  , TyCls(Ty,Cls,Syn)
			-- constructors:
  , mkLambdaBound      	-- :: InitAuxInfo -> TokenId -> TraceId
  , mkModule      	-- :: InitAuxInfo -> TokenId -> TraceId
  , mkClass      	-- :: InitAuxInfo -> TokenId -> TraceId
  , mkTyVar      	-- :: InitAuxInfo -> TokenId -> TraceId
  , mkTyCon             -- :: InitAuxInfo -> TokenId -> TraceId
  , mkField             -- :: InitAuxInfo -> TokenId -> TraceId
  , plus		-- :: TokenId -> AuxiliaryInfo -> TraceId
                        -- modifiers
  , dropModule          -- :: TraceId -> TraceId
  , modLambdaBound      -- :: InitAuxInfo -> TraceId -> TraceId
  , modLetBound         -- :: TraceId -> TraceId
  , modArity            -- :: TraceId -> Int -> TraceId
			-- selectors:
  , tokenId		-- :: TraceId -> TokenId
  , arity		-- :: TraceId -> Maybe Int
  , isLambdaBound	-- :: TraceId -> Bool
  , fixPriority		-- :: TraceId -> Int
  , tFixity             -- :: TraceId -> Fixity
  , tPriority           -- :: TraceId -> Int {0-9}
  , getUnqualified      -- :: TraceId -> String
  , hasInfo             -- :: TraceId -> Bool
  , hasValueInfo        -- :: TraceId -> Bool
  , tyClsInfo           -- :: TraceId -> TyCls
  , isExpandableTypeSynonym -- :: TraceId -> Bool
  , typeSynonymBody     -- :: TraceId -> Maybe TySynBody
  , isTraced            -- :: TraceId -> Bool
  , tTokenCons,tTokenNil,tTokenGtGt,tTokenGtGtEq,tTokenFail
  , tTokenAndAnd,tTokenEqualEqual,tTokenGreaterEqual,tTokenGreater,tTokenMinus
  , tTokenTrue,tTokenFalse,tTokenEQ,tTokenCompare
  ,tTokenLocalFromEnum,tTokenInt,tTokenMinBound,tTokenMaxBound
  ,tTokenFromEnum,tTokenToEnum,tTokenEnumFrom,tTokenEnumFromThen
  ,tTokenEnumFromTo,tTokenEnumFromThenTo,tTokenError
  ,tTokenCompose,tTokenShowsPrec,tTokenShowParen,tTokenShowChar
  ,tTokenShowString,tTokenReadsPrec,tTokenReadParen,tTokenYield
  ,tTokenAlt,tTokenThenAp,tTokenThenLex,tTokenRange,tTokenIndex,tTokenInRange
  ,tTokenMap,tTokenLocalToEnum,tTokenTuple2,tTokenFun
  ,tTokenRangeSize,tTokenReturn,tTokenPlus,tTokenTimes -- :: TraceId
  ) where

import TokenId 
  (TokenId,mkQualifiedTokenId,extractV,dropM,t_Colon,t_List,t_gtgt,t_gtgteq
  ,tfail,t_andand,t_equalequal,t_greater,t_greaterequal,tminus,tTrue
  ,tFalse,tEQ,tcompare,visImport,tInt,tminBound,tmaxBound
  ,tfromEnum,ttoEnum,tenumFrom,tenumFromThen,tenumFromTo
  ,tenumFromThenTo,t_error,t_dot,tshowsPrec,tshowParen,tshowChar
  ,tshowString,treadsPrec,treadParen,trange,tindex,tinRange,t_Tuple,t_Arrow)
import AuxTypes (AuxiliaryInfo(..),InitAuxInfo(..),Fixity(..),TyCls(..)
                ,TySynBody,emptyAux,untracedEmptyAux)
import Data.Maybe (isJust)
import SysDeps (unpackPS)


data TraceId = TI TokenId (Maybe AuxiliaryInfo)

instance Eq TraceId where
  TI t1 _ == TI t2 _ = t1 == t2


-- construction functions

mkLambdaBound :: InitAuxInfo -> TokenId -> TraceId
mkLambdaBound (InitAuxInfo tr) t = 
  TI t (Just (Value{ args=(-1), fixity=Def, priority=9, letBound=False
		   , traced=tr}))

plus :: TokenId -> AuxiliaryInfo -> TraceId
t `plus` aux = TI t (Just aux)

mkModule :: InitAuxInfo -> TokenId -> TraceId
mkModule = mkLambdaBound

mkClass :: InitAuxInfo -> TokenId -> TraceId
mkClass = mkLambdaBound

mkTyVar :: InitAuxInfo -> TokenId -> TraceId
mkTyVar = mkLambdaBound

mkTyCon :: InitAuxInfo -> TokenId -> TraceId
mkTyCon = mkLambdaBound

mkField :: InitAuxInfo -> TokenId -> TraceId
mkField = mkLambdaBound



-- modification functions

-- drop qualifier
dropModule :: TraceId -> TraceId
dropModule (TI tokenId aux) = TI (dropM tokenId) aux

modLambdaBound :: InitAuxInfo -> TraceId -> TraceId
modLambdaBound iai (TI token (Just aux@Value{})) = 
  TI token (Just aux{letBound=False})
modLambdaBound iai (TI token _) = mkLambdaBound iai token

modLetBound :: TraceId -> TraceId
modLetBound (TI token (Just aux)) = TI token (Just aux{letBound=True,args=0})
modLetBound (TI token Nothing) = error "modLetBound"

modArity :: TraceId -> Int -> TraceId
modArity (TI token (Just aux)) arity = TI token (Just aux{args=arity})
modArity (TI token Nothing) arity = error "modArity"

-- selection functions

tokenId :: TraceId -> TokenId
tokenId (TI t _) = t

arity :: TraceId -> Maybe Int
arity (TI _ (Just Value{args=a})) = Just a
arity (TI _ _)  = Nothing
 
isLambdaBound :: TraceId -> Bool
isLambdaBound (TI _ (Just Value{letBound=b})) = not b
isLambdaBound (TI _ Nothing) = 
  error "TraceId.isLambdaBound: no aux information"

tFixity :: TraceId -> Fixity
tFixity (TI _ Nothing) = Def
tFixity (TI _ (Just info)) = fixity info

tPriority :: TraceId -> Int {- 0-9 -}
tPriority (TI _ Nothing) = 9
tPriority (TI _ (Just info)) = priority info

fixPriority :: TraceId -> Int
fixPriority (TI _ Nothing) = 3	-- default fixity and priority
fixPriority (TI _ (Just info)) = encode (fixity info) (priority info)
  where
    encode Def     _ = 3
    encode L       n = 2 + (n*4)
    encode R       n = 1 + (n*4)
    encode None    n = 0 + (n*4)
    encode (Pre _) n = 0 + (n*4)

getUnqualified :: TraceId -> String
getUnqualified = reverse . unpackPS . extractV . tokenId

hasInfo :: TraceId -> Bool
hasInfo (TI _ aux) = isJust aux

hasValueInfo :: TraceId -> Bool
hasValueInfo (TI _ (Just Value{})) = True
hasValueInfo (TI _ _) = False

tyClsInfo :: TraceId -> TyCls
tyClsInfo (TI _ (Just (TyCls tyCls))) = tyCls

isExpandableTypeSynonym :: TraceId -> Bool
isExpandableTypeSynonym (TI _ (Just (TyCls (Syn n _)))) = n > 0
isExpandableTypeSynonym _ = False

typeSynonymBody :: TraceId -> Maybe TySynBody
typeSynonymBody (TI _ (Just (TyCls (Syn _ body)))) = Just body
typeSynonymBody _ = Nothing

typeSynonymHelpers :: TraceId -> Maybe Int
typeSynonymHelpers (TI _ (Just (TyCls (Syn helpers _)))) = Just helpers
typeSynonymHelpers _ = Nothing

isTraced :: TraceId -> Bool
isTraced (TI _ (Just Value{traced=tr})) = tr

-- TraceId versions of some hardcoded tokens 

tTokenCons :: TraceId
tTokenCons = t_Colon `plus` untracedEmptyAux{args=2}

tTokenNil :: TraceId
tTokenNil = t_List `plus` untracedEmptyAux{args=0}

tTokenGtGt :: TraceId
tTokenGtGt = t_gtgt `plus` untracedEmptyAux

tTokenGtGtEq :: TraceId
tTokenGtGtEq = t_gtgteq `plus` untracedEmptyAux

tTokenFail :: TraceId
tTokenFail = tfail `plus` untracedEmptyAux

tTokenAndAnd :: TraceId
tTokenAndAnd = t_andand `plus` untracedEmptyAux{args=2}

tTokenEqualEqual :: TraceId
tTokenEqualEqual = t_equalequal `plus` untracedEmptyAux

tTokenGreater :: TraceId
tTokenGreater = t_greater `plus` untracedEmptyAux

tTokenGreaterEqual :: TraceId
tTokenGreaterEqual = t_greaterequal `plus` untracedEmptyAux

tTokenMinus :: TraceId
tTokenMinus = tminus `plus` untracedEmptyAux

tTokenTrue :: TraceId
tTokenTrue = tTrue `plus` untracedEmptyAux{args=0}

tTokenFalse :: TraceId
tTokenFalse = tFalse `plus` untracedEmptyAux{args=0}

tTokenEQ :: TraceId
tTokenEQ = tEQ `plus` untracedEmptyAux{args=0}

tTokenCompare :: TraceId
tTokenCompare = tcompare `plus` untracedEmptyAux

tTokenLocalFromEnum :: TraceId
tTokenLocalFromEnum = visImport "localFromEnum" `plus` untracedEmptyAux{args=1}

tTokenInt :: TraceId
tTokenInt = tInt `plus` untracedEmptyAux

tTokenMinBound :: TraceId
tTokenMinBound = tminBound `plus` untracedEmptyAux

tTokenMaxBound :: TraceId
tTokenMaxBound = tmaxBound `plus` untracedEmptyAux

tTokenFromEnum :: TraceId
tTokenFromEnum = tfromEnum `plus` untracedEmptyAux

tTokenToEnum :: TraceId
tTokenToEnum = ttoEnum `plus` untracedEmptyAux

tTokenEnumFrom :: TraceId
tTokenEnumFrom = tenumFrom `plus` untracedEmptyAux

tTokenEnumFromTo :: TraceId
tTokenEnumFromTo = tenumFromTo `plus` untracedEmptyAux

tTokenEnumFromThen :: TraceId
tTokenEnumFromThen = tenumFromThen `plus` untracedEmptyAux

tTokenEnumFromThenTo :: TraceId
tTokenEnumFromThenTo = tenumFromThenTo `plus` untracedEmptyAux

tTokenError :: TraceId
tTokenError = t_error `plus` untracedEmptyAux{args=1}

tTokenCompose :: TraceId
tTokenCompose = t_dot `plus` untracedEmptyAux{args=3}

tTokenShowsPrec :: TraceId
tTokenShowsPrec = tshowsPrec `plus` untracedEmptyAux

tTokenShowParen :: TraceId
tTokenShowParen = tshowParen `plus` untracedEmptyAux{args=2}

tTokenShowString :: TraceId
tTokenShowString = tshowString `plus` untracedEmptyAux{args=0}

tTokenShowChar :: TraceId
tTokenShowChar = tshowChar `plus` untracedEmptyAux{args=0}

tTokenReadsPrec :: TraceId
tTokenReadsPrec = treadsPrec `plus` untracedEmptyAux

tTokenReadParen :: TraceId
tTokenReadParen = treadParen `plus` untracedEmptyAux{args=2}

tTokenYield :: TraceId
tTokenYield = 
  mkQualifiedTokenId "PreludeBasic" "yield" `plus` untracedEmptyAux{args=2}

tTokenAlt :: TraceId
tTokenAlt = 
  mkQualifiedTokenId "PreludeBasic" "alt" `plus` untracedEmptyAux{args=3}

tTokenThenLex :: TraceId
tTokenThenLex = 
  mkQualifiedTokenId "PreludeBasic" "thenLex" `plus` untracedEmptyAux{args=2}

tTokenThenAp :: TraceId
tTokenThenAp = 
  mkQualifiedTokenId "PreludeBasic" "thenAp" `plus` untracedEmptyAux{args=0}

tTokenRange :: TraceId
tTokenRange = trange `plus` untracedEmptyAux

tTokenIndex :: TraceId
tTokenIndex = tindex `plus` untracedEmptyAux

tTokenInRange :: TraceId
tTokenInRange = tinRange `plus` untracedEmptyAux

tTokenMap :: TraceId
tTokenMap = 
  mkQualifiedTokenId "PreludeBasic" "map" `plus` untracedEmptyAux{args=2}

tTokenLocalToEnum :: TraceId
tTokenLocalToEnum = visImport "localToEnum" `plus` untracedEmptyAux{args=1}

tTokenTuple2 :: TraceId
tTokenTuple2 = t_Tuple 2 `plus` untracedEmptyAux{args=2}

tTokenFun :: TraceId
tTokenFun = t_Arrow `plus` untracedEmptyAux

tTokenRangeSize :: TraceId
tTokenRangeSize = mkQualifiedTokenId "Ix" "rangeSize" `plus` untracedEmptyAux

tTokenReturn :: TraceId
tTokenReturn = mkQualifiedTokenId "PreludeBasic" "return" `plus` untracedEmptyAux

tTokenPlus :: TraceId
tTokenPlus = mkQualifiedTokenId "PreludeBasic" "+" `plus` untracedEmptyAux

tTokenTimes :: TraceId
tTokenTimes = mkQualifiedTokenId "PreludeBasic" "*" `plus` untracedEmptyAux