symbolLinkingExpr db imps su expr@(FunctionCall exprf args _) = if atsFailed then typeLinkingFailure' $ (show expr) ++ "Function types of Args " ++ (show ats) else
                                                                 case fss' of
                                                                     [] -> typeLinkingFailure' ("Function cannot find " ++ (show $ traverseFieldEntryWithImports db imps ["Arrays", "equals"]) ++ (show exprf) ++ (show fss) ++ (show args))
                                                                     [fs] -> [fs]
                                                                     _ -> typeLinkingFailure' ("Function find multi " ++ (show exprf) ++ (show args))
        where
                ats = map (typeLinkingExpr db imps su) args
                atsFailed = or $ map null ats
                fss = symbolLinkingExpr db imps su exprf
                fss' = [fs | fs@(FUNC  mds ls ln pt rt) <- fss, argsMatching (concat ats) pt]

-- import rule plays here
symbolLinkingExpr db imps su expr@(FunctionCall exprf args _) = if atsFailed then typeLinkingFailure' $ (show expr) ++ "Function types of Args " ++ (show ats) else
                                                                 case fss' of
                                                                     [] -> typeLinkingFailure' ("Function cannot find " ++ (show $ traverseFieldEntryWithImports db imps ["Arrays", "equals"]) ++ (show exprf) ++ (show fss) ++ (show args))
                                                                     [fs] -> [fs]
                                                                     _ -> typeLinkingFailure' ("Function find multi " ++ (show exprf) ++ (show args))
        where
                ats = map (typeLinkingExpr db imps su) args
                atsFailed = or $ map null ats
                fss = symbolLinkingExpr db imps su exprf
                fss' = [fs | fs@(FUNC  mds ls ln pt rt) <- fss, argsMatching (concat ats) pt]

-- import rule plays here
symbolLinkingExpr db imps su expr@(FunctionCall exprf args _) = if atsFailed then typeLinkingFailure' $ (show expr) ++ "Function types of Args " ++ (show ats) else
                                                                 case fss' of
                                                                     [] -> typeLinkingFailure' ("Function cannot find " ++ (show $ traverseFieldEntryWithImports db imps ["Arrays", "equals"]) ++ (show exprf) ++ (show fss) ++ (show args))
                                                                     [fs] -> [fs]
                                                                     _ -> typeLinkingFailure' ("Function find multi " ++ (show exprf) ++ (show args))
        where
                ats = map (typeLinkingExpr db imps su) args
                atsFailed = or $ map null ats
                fss = symbolLinkingExpr db imps su exprf
                fss' = [fs | fs@(FUNC  mds ls ln pt rt) <- fss, argsMatching (concat ats) pt]

-- import rule plays here