@@ -1,12 +1,12 @@
1−module Idris.Apropos where
1+module Idris.Apropos (apropos, aproposModules) where
22
33import Idris.AbsSyntax
44import Idris.Core.Evaluate (ctxtAlist, Def(..))
55import Idris.Core.TT (Name(..), Type, TT(..), NameType(..), Binder(..), Const(..),
66 lookupCtxtExact, toAlist)
7−import Idris.Docstrings (Docstring, containsText)
7+import Idris.Docstrings (Docstring, DocTerm, containsText)
88
9−import Data.List (nub)
9+import Data.List (nub, nubBy, intersperse)
1010import qualified Data.Text as T
1111
1212-- | Find definitions that are relevant to all space-delimited components of
@@ -22,11 +22,25 @@ apropos ist what = let defs = ctxtAlist (tt_ctxt ist)
2222 docs = toAlist (idris_docstrings ist)
2323 in nub (map fst (isAproposAll parts defs) ++
2424 map fst (isAproposAll parts docs))
25− where isAproposAll [] xs = xs
25+ where isAproposAll [] xs = xs
2626 isAproposAll (what:more) xs = filter (isApropos what)
2727 (isAproposAll more xs)
2828 parts = filter ((> 0) . T.length) . T.splitOn (T.pack " ") $ what
2929
30+-- | Find modules whose names or docstrings contain all the
31+-- space-delimited components of some string.
32+aproposModules :: IState -> T.Text -> [(String, Docstring DocTerm)]
33+aproposModules ist what = let mods = toAlist (idris_moduledocs ist)
34+ found = nubBy (\x y -> fst x == fst y)
35+ (isAproposAll parts mods)
36+ in map unModName found
37+ where isAproposAll [] xs = xs
38+ isAproposAll (what:more) xs = filter (\(n,d) -> isApropos what n || isApropos what d)
39+ (isAproposAll more xs)
40+ parts = filter ((> 0) . T.length) . T.splitOn (T.pack " ") $ what
41+ unModName (NS _ ns, d) = ((concat . intersperse "." . map T.unpack . reverse) ns, d)
42+ unModName (n, d) = ("<<MODULE>>", d)
43+
3044textIn :: T.Text -> T.Text -> Bool
3145textIn a b = T.isInfixOf (T.toLower a) (T.toLower b)
3246