module Language.Lua.Bytecode.FunId where
import Data.List(intercalate)
import Text.PrettyPrint(text)
import Text.Read(readMaybe)
newtype FunId = FunId [Int]
deriving (Eq,Ord,Show)
isRootFun :: FunId -> Bool
isRootFun (FunId x) = case x of
[_] -> True
_ -> False
getRoot :: FunId -> Maybe Int
getRoot (FunId xs) = if null xs then Nothing else Just (last xs)
noFun :: FunId
noFun = FunId []
isNoFun :: FunId -> Bool
isNoFun (FunId xs) = null xs
rootFun :: Int -> FunId
rootFun n = FunId [n]
subFun :: FunId -> Int -> FunId
subFun (FunId xs) y = FunId (y : xs)
funIdString :: FunId -> String
funIdString (FunId xs) = intercalate "_" (map show (reverse xs))
funIdFromString :: String -> Maybe FunId
funIdFromString = fmap (FunId . reverse) . mapM readMaybe . words . map cvt
where
cvt x = if x == '_' then ' ' else x
funIdList :: FunId -> [Int]
funIdList (FunId xs) = reverse xs
funNestDepth :: FunId -> Int
funNestDepth (FunId xs) = length xs