forked from purescript/purescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilter.hs
More file actions
93 lines (78 loc) · 2.99 KB
/
Filter.hs
File metadata and controls
93 lines (78 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
-----------------------------------------------------------------------------
--
-- Module : Language.PureScript.Ide.Filter
-- Description : Filters for psc-ide commands
-- Copyright : Christoph Hegemann 2016
-- License : MIT (http://opensource.org/licenses/MIT)
--
-- Maintainer : Christoph Hegemann <christoph.hegemann1337@gmail.com>
-- Stability : experimental
--
-- |
-- Filters for psc-ide commands
-----------------------------------------------------------------------------
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Language.PureScript.Ide.Filter
( Filter
, moduleFilter
, prefixFilter
, equalityFilter
, applyFilters
) where
import Protolude hiding (isPrefixOf)
import Data.Aeson
import Data.Text (isPrefixOf)
import qualified Language.PureScript as P
import Language.PureScript.Ide.Types
import Language.PureScript.Ide.Util
newtype Filter = Filter (Endo [Module]) deriving(Monoid)
type Module = (P.ModuleName, [IdeDeclarationAnn])
mkFilter :: ([Module] -> [Module]) -> Filter
mkFilter = Filter . Endo
-- | Only keeps the given Modules
moduleFilter :: [P.ModuleName] -> Filter
moduleFilter =
mkFilter . moduleFilter'
moduleFilter' :: [P.ModuleName] -> [Module] -> [Module]
moduleFilter' moduleIdents = filter (flip elem moduleIdents . fst)
-- | Only keeps Identifiers that start with the given prefix
prefixFilter :: Text -> Filter
prefixFilter "" = mkFilter identity
prefixFilter t = mkFilter $ identFilter prefix t
where
prefix :: IdeDeclaration -> Text -> Bool
prefix ed search = search `isPrefixOf` identifierFromIdeDeclaration ed
-- | Only keeps Identifiers that are equal to the search string
equalityFilter :: Text -> Filter
equalityFilter = mkFilter . identFilter equality
where
equality :: IdeDeclaration -> Text -> Bool
equality ed search = identifierFromIdeDeclaration ed == search
identFilter :: (IdeDeclaration -> Text -> Bool) -> Text -> [Module] -> [Module]
identFilter predicate search =
filter (not . null . snd) . fmap filterModuleDecls
where
filterModuleDecls :: Module -> Module
filterModuleDecls (moduleIdent, decls) =
(moduleIdent, filter (flip predicate search . discardAnn) decls)
runFilter :: Filter -> [Module] -> [Module]
runFilter (Filter f) = appEndo f
applyFilters :: [Filter] -> [Module] -> [Module]
applyFilters = runFilter . fold
instance FromJSON Filter where
parseJSON = withObject "filter" $ \o -> do
(filter' :: Text) <- o .: "filter"
case filter' of
"exact" -> do
params <- o .: "params"
search <- params .: "search"
return $ equalityFilter search
"prefix" -> do
params <- o.: "params"
search <- params .: "search"
return $ prefixFilter search
"modules" -> do
params <- o .: "params"
modules <- map P.moduleNameFromString <$> params .: "modules"
return $ moduleFilter modules
_ -> mzero