module PureScript.Ide.Filter
(moduleFilter, prefixFilter, equalityFilter, dependencyFilter,
runFilter)
where
import Data.Maybe (mapMaybe, listToMaybe)
import Data.Text (Text, isPrefixOf)
import PureScript.Ide.Types
moduleFilter :: [ModuleIdent] -> Filter
moduleFilter =
Filter . moduleFilter'
moduleFilter' :: [ModuleIdent] -> [Module] -> [Module]
moduleFilter' moduleIdents = filter (flip elem moduleIdents . fst)
dependencyFilter :: [ModuleIdent] -> Filter
dependencyFilter = Filter . dependencyFilter'
dependencyFilter' :: [ModuleIdent] -> [Module] -> [Module]
dependencyFilter' moduleIdents mods =
moduleFilter' (concatMap (getDepForModule mods) moduleIdents) mods
where
getDepForModule :: [Module] -> ModuleIdent -> [ModuleIdent]
getDepForModule ms moduleIdent =
moduleIdent : maybe [] extractDeps (findModule moduleIdent ms)
findModule :: ModuleIdent -> [Module] -> Maybe Module
findModule i ms = listToMaybe $ filter go ms
where go (mn, _) = i == mn
extractDeps :: Module -> [ModuleIdent]
extractDeps = mapMaybe extractDep . snd
where extractDep (Dependency n _) = Just n
extractDep (ModuleDecl _ _) = Nothing
extractDep _ = Nothing
prefixFilter :: Text -> Filter
prefixFilter "" = Filter id
prefixFilter t = Filter $ identFilter prefix t
where
prefix :: ExternDecl -> Text -> Bool
prefix (FunctionDecl name _) search = search `isPrefixOf` name
prefix (DataDecl name _) search = search `isPrefixOf` name
prefix (ModuleDecl name _) search = search `isPrefixOf` name
prefix _ _ = False
equalityFilter :: Text -> Filter
equalityFilter = Filter . identFilter equality
where
equality :: ExternDecl -> Text -> Bool
equality (FunctionDecl name _) prefix = prefix == name
equality (DataDecl name _) prefix = prefix == name
equality _ _ = False
identFilter :: (ExternDecl -> Text -> Bool ) -> Text -> [Module] -> [Module]
identFilter predicate search =
filter (not . null . snd) . fmap filterModuleDecls
where
filterModuleDecls :: Module -> Module
filterModuleDecls (moduleIdent,decls) =
(moduleIdent, filter (`predicate` search) decls)
runFilter :: Filter -> [Module] -> [Module]
runFilter (Filter f) = f