@@ -3,8 +3,10 @@ module Docs.Search.TypeIndex where
33import Prelude
44
55import Docs.Search.Config (config )
6- import Docs.Search.Declarations (Declarations (..))
6+ import Docs.Search.Declarations (resultsForEntry )
7+ import Docs.Search.DocsJson (DocsJson (..))
78import Docs.Search.SearchResult (ResultInfo (..), SearchResult )
9+ import Docs.Search.TypeDecoder (Type )
810import Docs.Search.TypeQuery (TypeQuery )
911import Docs.Search.TypeShape (shapeOfType , shapeOfTypeQuery , stringifyShape )
1012
@@ -13,14 +15,10 @@ import Data.Argonaut.Core (Json)
1315import Data.Argonaut.Decode (decodeJson )
1416import Data.Array as Array
1517import Data.Either (hush )
16- import Data.List (List )
17- import Data.List as List
1818import Data.Map (Map )
1919import Data.Map as Map
20- import Data.Maybe (Maybe (..), fromMaybe' )
20+ import Data.Maybe (Maybe (..), fromMaybe' , isJust )
2121import Data.Newtype (class Newtype , unwrap , wrap )
22- import Data.Search.Trie as Trie
23- import Data.Tuple (Tuple (..), snd )
2422import Effect (Effect )
2523import Effect.Aff (Aff , try )
2624
@@ -30,41 +28,39 @@ derive newtype instance semigroupTypeIndex :: Semigroup TypeIndex
3028derive newtype instance monoidTypeIndex :: Monoid TypeIndex
3129derive instance newtypeTypeIndex :: Newtype TypeIndex _
3230
33- insert
34- :: String
35- -> Maybe (Array SearchResult )
36- -> TypeIndex
37- -> TypeIndex
38- insert key value = unwrap >>> Map .insert key value >>> wrap
39-
40- mkTypeIndex :: Declarations -> TypeIndex
41- mkTypeIndex (Declarations trie) = TypeIndex $ map (Array .fromFoldable >>> Just ) types
31+ mkTypeIndex :: Array DocsJson -> TypeIndex
32+ mkTypeIndex docsJsons =
33+ TypeIndex $ map Just $ Array .foldr insert mempty docsJsons
4234 where
43- insertTypes
44- :: Tuple String SearchResult
45- -> Map String (List SearchResult )
46- -> Map String (List SearchResult )
47- insertTypes (Tuple shape result) =
48- Map .insertWith append shape (List .singleton result)
35+ insert :: DocsJson -> Map String (Array SearchResult ) -> Map String (Array SearchResult )
36+ insert docsJson mp =
37+ Array .foldr (\result ->
38+ case getType result of
39+ Just ty ->
40+ Map .insertWith append (stringifyShape $ shapeOfType ty) (pure result)
41+ Nothing -> identity
42+ ) mp (allResults docsJson)
4943
50- types = List .foldr insertTypes mempty do
44+ allResults :: DocsJson -> Array SearchResult
45+ allResults (DocsJson { name, declarations }) =
46+ declarations >>= (resultsForEntry name >>> map (_.result) >>> Array .fromFoldable)
5147
52- results <- Trie .entriesUnordered trie >>= snd
48+ resultsWithTypes :: DocsJson -> Array SearchResult
49+ resultsWithTypes docsJson = Array .filter (getType >>> isJust) $ allResults docsJson
5350
54- case (unwrap results).info of
55- ValueResult dict ->
56- insertTypeResultsFor dict.type results
51+ getType :: SearchResult -> Maybe Type
52+ getType sr =
53+ case (unwrap sr).info of
54+ ValueResult dict ->
55+ Just dict.type
5756
58- TypeClassMemberResult dict ->
59- insertTypeResultsFor dict.type results
57+ TypeClassMemberResult dict ->
58+ Just dict.type
6059
61- TypeSynonymResult dict ->
62- insertTypeResultsFor dict.type results
63- _ -> mempty
60+ TypeSynonymResult dict ->
61+ Just dict.type
6462
65- insertTypeResultsFor ty results =
66- let path = stringifyShape (shapeOfType ty) in
67- pure $ Tuple path results
63+ _ -> Nothing
6864
6965lookup
7066 :: String
@@ -82,6 +78,14 @@ lookup key typeIndex@(TypeIndex map) =
8278 results <- hush (decodeJson json)
8379 pure { typeIndex: insert key (Just results) typeIndex, results }
8480
81+ where
82+ insert
83+ :: String
84+ -> Maybe (Array SearchResult )
85+ -> TypeIndex
86+ -> TypeIndex
87+ insert k v = unwrap >>> Map .insert k v >>> wrap
88+
8589query
8690 :: TypeIndex
8791 -> TypeQuery
0 commit comments