git.iko.soy/rowtype-yoga/purescript-docs-search
on master help sign in
Wrap ModuleName and PackageName strings into newtypes
commit5bf02c20992ca23cc828282f7b533683f4c7d422 authorklntsky <klntsky@gmail.com> dateSun 26 Jul 2020, 22:30 (6 years ago) parent16e1a4b
19 files changed+258−175
src/Docs/Search/App/SearchResults.purs+25−25 src/Docs/Search/App/Sidebar.purs+7−6 src/Docs/Search/Declarations.purs+44−40 src/Docs/Search/Engine.purs+10−10 src/Docs/Search/Interactive.purs+23−17 src/Docs/Search/ModuleIndex.purs+9−6 src/Docs/Search/PackageIndex.purs+15−12 src/Docs/Search/Score.purs+17−12 src/Docs/Search/SearchResult.purs+3−2 src/Docs/Search/TypeDecoder.purs+4−4 src/Docs/Search/TypeIndex.purs+3−1 src/Docs/Search/TypePrinter.purs+2−2 src/Docs/Search/TypeQuery.purs+3−3 src/Docs/Search/TypeShape.purs+1−1 src/Docs/Search/Types.purs+56−2 test/Main.purs+16−16 test/Test/Declarations.purs+14−11 test/Test/ModuleIndex.purs+3−2 test/Test/TypeQuery.purs+3−3
src/Docs/Search/App/SearchResults.purs+25−25
@@ -14,6 +14,7 @@ import Docs.Search.PackageIndex (PackageResult)
1414import Docs.Search.SearchResult (ResultInfo(..), SearchResult(..))
1515import Docs.Search.TypeDecoder (Constraint(..), FunDep(..), FunDeps(..), Kind(..), QualifiedName(..), Type(..), TypeArgument(..), joinForAlls, joinRows)
1616import Docs.Search.TypeIndex (TypeIndex)
17+import Docs.Search.Types (ModuleName(..), packageInfoToString)
1718
1819import Prelude
1920
@@ -21,7 +22,7 @@ import Data.Array ((!!))
2122import Data.Array as Array
2223import Data.List as List
2324import Data.Maybe (Maybe(..), isJust, fromMaybe)
24−import Data.Newtype (wrap)
25+import Data.Newtype (wrap, unwrap)
2526import Data.String.CodeUnits (stripSuffix) as String
2627import Data.String.Common (null, trim) as String
2728import Data.String.Pattern (Pattern(..)) as String
@@ -63,7 +64,7 @@ data Query a
6364
6465
6566data Action
66− = SearchResultClicked String
67+ = SearchResultClicked ModuleName
6768 | MoreResultsRequested
6869
6970
@@ -145,7 +146,7 @@ handleAction = case _ of
145146 location <- Window.location window
146147 pathname <- Location.pathname location
147148 pure $ isJust $
148− String.stripSuffix (String.Pattern $ moduleName <> ".html") pathname
149+ String.stripSuffix (String.Pattern $ unwrap moduleName <> ".html") pathname
149150
150151 when onThisPage do
151152 showPageContents
@@ -254,7 +255,7 @@ renderPackageResult { name, description, repository } =
254255 , HH.a [ HP.class_ (wrap "result__link")
255256 , HP.href $ fromMaybe "" repository # homePageFromRepository
256257 ]
257− [ HH.text name ]
258+ [ HH.text $ unwrap name ]
258259 ]
259260 ]
260261 ] <>
@@ -280,9 +281,9 @@ renderModuleResult { name, package } =
280281 [ HH.text "M" ]
281282
282283 , HH.a [ HP.class_ (wrap "result__link")
283− , HP.href $ name <> ".html"
284+ , HP.href $ unwrap name <> ".html"
284285 ]
285− [ HH.text name ]
286+ [ HH.text $ unwrap name ]
286287 ]
287288 ]
288289 ]
@@ -300,7 +301,7 @@ renderSearchResult markdownIt (SearchResult result) =
300301 [ HH.a [ HP.class_ (wrap "result__link")
301302 , HE.onClick $ const $ Just $ SearchResultClicked result.moduleName
302303 , HP.href $
303− result.moduleName <> ".html#" <>
304+ unwrap result.moduleName <> ".html#" <>
304305 result.hashAnchor <> ":" <> result.name
305306 ]
306307 [ HH.text result.name ]
@@ -321,7 +322,7 @@ renderSearchResult markdownIt (SearchResult result) =
321322 , HP.title "Package"
322323 ]
323324 [ HH.text "P" ]
324− , HH.text result.packageName
325+ , HH.text $ packageInfoToString result.packageInfo
325326 ]
326327
327328 , HH.span [ HP.class_ (wrap "result__actions__item") ]
@@ -331,7 +332,7 @@ renderSearchResult markdownIt (SearchResult result) =
331332 , HP.title "Module"
332333 ]
333334 [ HH.text "M" ]
334− , HH.text result.moduleName
335+ , HH.text $ unwrap result.moduleName
335336 ]
336337 ]
337338 ]
@@ -341,7 +342,7 @@ renderResultType
341342 :: forall a rest
342343 . { info :: ResultInfo
343344 , name :: String
344− , moduleName :: String
345+ , moduleName :: ModuleName
345346 | rest
346347 }
347348 -> Array (HH.HTML a Action)
@@ -371,7 +372,7 @@ renderResultType result =
371372
372373renderValueSignature
373374 :: forall a rest
374− . { moduleName :: String
375+ . { moduleName :: ModuleName
375376 , name :: String
376377 | rest
377378 }
@@ -391,7 +392,7 @@ renderTypeClassSignature
391392 , arguments :: Array TypeArgument
392393 , superclasses :: Array Constraint
393394 }
394− -> { name :: String, moduleName :: String | rest }
395+ -> { name :: String, moduleName :: ModuleName | rest }
395396 -> Array (HH.HTML a Action)
396397renderTypeClassSignature { fundeps, arguments, superclasses } { name, moduleName } =
397398 [ keyword "class"
@@ -520,14 +521,14 @@ renderType = case _ of
520521 TypeOp qname -> renderQualifiedName true TypeLevel qname
521522
522523 TypeApp (TypeApp (TypeConstructor
523− (QualifiedName { moduleName: [ "Prim" ]
524+ (QualifiedName { moduleNameParts: [ "Prim" ]
524525 , name: "Function" })) t1) t2 ->
525526 HH.span_ [ renderType t1
526527 , syntax " -> "
527528 , renderType t2
528529 ]
529530
530− TypeApp (TypeConstructor (QualifiedName { moduleName: [ "Prim" ]
531+ TypeApp (TypeConstructor (QualifiedName { moduleNameParts: [ "Prim" ]
531532 , name: "Record" }))
532533 row ->
533534 renderRow false row
@@ -635,6 +636,9 @@ renderRow asRow =
635636 opening = if asRow then "( " else "{ "
636637 closing = if asRow then " )" else " }"
637638
639+ primRecord :: QualifiedName
640+ primRecord = QualifiedName { moduleNameParts: [ "Prim" ], name: "Record" }
641+
638642
639643renderConstraint
640644 :: forall a
@@ -652,18 +656,18 @@ renderQualifiedName
652656 -> DeclLevel
653657 -> QualifiedName
654658 -> HH.HTML a Action
655−renderQualifiedName isInfix level (QualifiedName { moduleName, name })
659+renderQualifiedName isInfix level (QualifiedName { moduleNameParts, name })
656660 = if isBuiltIn then
657661 HH.text name
658662 else
659663 HH.a [ HE.onClick $ const $ Just $
660− SearchResultClicked moduleNameString
661− , makeHref level isInfix moduleNameString name
664+ SearchResultClicked $ moduleName
665+ , makeHref level isInfix moduleName name
662666 ]
663667 [ HH.text name ]
664668 where
665− moduleNameString = Array.intercalate "." moduleName
666− isBuiltIn = moduleName !! 0 == Just "Prim"
669+ moduleName = ModuleName $ Array.intercalate "." $ moduleNameParts
670+ isBuiltIn = moduleNameParts !! 0 == Just "Prim"
667671
668672
669673renderKind
@@ -681,20 +685,16 @@ makeHref
681685 :: forall t rest
682686 . DeclLevel
683687 -> Boolean
684− -> String
688+ -> ModuleName
685689 -> String
686690 -> HH.IProp ( href :: String | rest ) t
687691makeHref level isInfix moduleName name =
688692 HP.href $
689− moduleName <> ".html#" <>
693+ unwrap moduleName <> ".html#" <>
690694 declLevelToHashAnchor level <> ":" <>
691695 if isInfix then "type (" <> name <> ")" else name
692696
693697
694−primRecord :: QualifiedName
695−primRecord = QualifiedName { moduleName: [ "Prim" ], name: "Record" }
696−
697−
698698keyword
699699 :: forall a
700700 . String
src/Docs/Search/App/Sidebar.purs+7−6
@@ -2,9 +2,10 @@ module Docs.Search.App.Sidebar where
22
33import Docs.Search.Config (config)
44import Docs.Search.ModuleIndex (PackedModuleIndex)
5−import Docs.Search.Types (ModuleName, PackageName)
5+import Docs.Search.Types (ModuleName, PackageName(..))
66
77import Prelude
8+
89import Data.Array as Array
910import Data.Lens ((.~))
1011import Data.Lens.Record (prop)
@@ -12,7 +13,7 @@ import Data.List (foldr)
1213import Data.Map (Map)
1314import Data.Map as Map
1415import Data.Maybe (Maybe(..), isJust)
15−import Data.Newtype (wrap)
16+import Data.Newtype (wrap, unwrap)
1617import Data.Set (Set)
1718import Data.Set as Set
1819import Data.Symbol (SProxy(..))
@@ -132,7 +133,7 @@ render { moduleIndex, groupingMode, moduleNames, isIndexHTML } =
132133 ]
133134 where
134135
135− renderPackageEntry (packageName /\ modules) =
136+ renderPackageEntry (PackageName packageName /\ modules) =
136137 HH.li [ HP.classes [ wrap "li-package" ] ]
137138 [ HH.details_
138139 [ HH.summary_ [ HH.text packageName ]
@@ -142,11 +143,11 @@ render { moduleIndex, groupingMode, moduleNames, isIndexHTML } =
142143
143144 renderModuleName moduleName =
144145 HH.li_
145− [ HH.a [ HP.href (moduleName <> ".html") ]
146− [ HH.text moduleName ]
146+ [ HH.a [ HP.href (unwrap moduleName <> ".html") ]
147+ [ HH.text $ unwrap moduleName ]
147148 ]
148149
149− packageList :: Array (String /\ Set ModuleName)
150+ packageList :: Array (PackageName /\ Set ModuleName)
150151 packageList = Map.toUnfoldable moduleIndex
151152
152153
src/Docs/Search/Declarations.purs+44−40
@@ -1,10 +1,10 @@
11module Docs.Search.Declarations where
22
33import Docs.Search.DocsJson (ChildDeclType(..), ChildDeclaration(..), DeclType(..), Declaration(..), DocsJson(..), SourceSpan)
4−import Docs.Search.Score (Scores)
4+import Docs.Search.Score (Scores, getPackageScore, getPackageScoreForPackageName)
55import Docs.Search.SearchResult (ResultInfo(..), SearchResult(..))
66import Docs.Search.TypeDecoder (Constraint(..), QualifiedName(..), Type(..), Kind, joinForAlls)
7−import Docs.Search.Types (ModuleName, PackageName)
7+import Docs.Search.Types (ModuleName(..), PackageName(..), PackageInfo(..))
88
99import Prelude
1010
@@ -14,7 +14,6 @@ import Data.Array as Array
1414import Data.Foldable (foldr)
1515import Data.List (List, (:))
1616import Data.List as List
17−import Data.Map as Map
1817import Data.Maybe (Maybe(..), fromMaybe)
1918import Data.Newtype (class Newtype, unwrap, wrap)
2019import Data.Search.Trie (Trie, alter)
@@ -24,8 +23,7 @@ import Data.String.Common (toLower)
2423import Data.String.Pattern (Pattern(..))
2524
2625
27−newtype Declarations
28− = Declarations (Trie Char (List SearchResult))
26+newtype Declarations = Declarations (Trie Char (List SearchResult))
2927
3028derive instance newtypeDeclarations :: Newtype Declarations _
3129derive newtype instance semigroupDeclarations :: Semigroup Declarations
@@ -42,7 +40,7 @@ insertDocsJson
4240 -> Trie Char (List SearchResult)
4341 -> Trie Char (List SearchResult)
4442insertDocsJson scores (DocsJson { name, declarations }) trie
45− = foldr (insertDeclaration scores name) trie declarations
43+ = foldr (insertDeclaration scores $ ModuleName name) trie declarations
4644
4745
4846insertDeclaration
@@ -63,13 +61,13 @@ insertSearchResult
6361 -> Trie Char (List SearchResult)
6462insertSearchResult { path, result } trie =
6563 let path' = List.fromFoldable $ toCharArray $ toLower path in
66− alter path' (Just <<< updateResults) trie
67− where
68− updateResults mbOldResults
69− | Just oldResults <- mbOldResults =
70− result : oldResults
71− | otherwise =
72− List.singleton result
64+ alter path' (Just <<< updateResults) trie
65+ where
66+ updateResults mbOldResults
67+ | Just oldResults <- mbOldResults =
68+ result : oldResults
69+ | otherwise =
70+ List.singleton result
7371
7472
7573-- | For each declaration, extract its own `SearchResult` and `SearchResult`s
@@ -82,19 +80,17 @@ resultsForDeclaration
8280 , result :: SearchResult
8381 }
8482resultsForDeclaration scores moduleName indexEntry@(Declaration entry) =
85− let { info, title, sourceSpan, comments, children } = entry
86− { name, declLevel } = getLevelAndName info.declType title
87− packageName = extractPackageName moduleName sourceSpan
88− in case mkInfo declLevel indexEntry of
89− Nothing -> mempty
90− Just info' ->
83+ case mkInfo declLevel indexEntry of
84+ Nothing -> mempty
85+ Just info' ->
9186 let result = SearchResult { name: title
9287 , comments
9388 , hashAnchor: declLevelToHashAnchor declLevel
9489 , moduleName
9590 , sourceSpan
96− , packageName
97− , score: fromMaybe 0 $ Map.lookup packageName scores
91+ , packageInfo
92+ , score:
93+ fromMaybe 0 $ getPackageScoreForPackageName scores <$> mbPackageName
9894 , info: info'
9995 }
10096 in
@@ -104,8 +100,16 @@ resultsForDeclaration scores moduleName indexEntry@(Declaration entry) =
104100 }
105101 ) <>
106102 ( List.fromFoldable children >>=
107− resultsForChildDeclaration scores packageName moduleName result
103+ resultsForChildDeclaration scores packageInfo moduleName result
108104 )
105+ where
106+ { info, title, sourceSpan, comments, children } = entry
107+ { name, declLevel } = getLevelAndName info.declType title
108+ packageInfo = extractPackageName moduleName sourceSpan
109+ mbPackageName =
110+ case packageInfo of
111+ Package packageName -> Just packageName
112+ _ -> Nothing
109113
110114
111115mkInfo :: DeclLevel -> Declaration -> Maybe ResultInfo
@@ -188,31 +192,30 @@ getLevelAndName DeclExternKind name = { name, declLevel: KindLevel }
188192-- | Extract package name from `sourceSpan.name`, which contains path to
189193-- | the source file. If `ModuleName` string starts with `Prim.`, it's a
190194-- | built-in (guaranteed by the compiler).
191−extractPackageName :: ModuleName -> Maybe SourceSpan -> PackageName
192−extractPackageName moduleName _
193− | String.split (Pattern ".") moduleName !! 0 == Just "Prim" = "<builtin>"
194−extractPackageName _ Nothing = "<unknown>"
195+extractPackageName :: ModuleName -> Maybe SourceSpan -> PackageInfo
196+extractPackageName (ModuleName moduleName) _
197+ | String.split (Pattern ".") moduleName !! 0 == Just "Prim" = Builtin
198+extractPackageName _ Nothing = UnknownPackage
195199extractPackageName _ (Just { name }) =
196− let dirs = String.split (Pattern "/") name
197− in
198− fromMaybe "<local package>" do
199− topLevelDir <- dirs !! 0
200− if topLevelDir == ".spago"
201− then dirs !! 1
202− else do
203− bowerDirIx <- Array.findIndex (_ == "bower_components") dirs
204− dirs !! (bowerDirIx + 1)
200+ fromMaybe LocalPackage do
201+ topLevelDir <- dirs !! 0
202+ if topLevelDir == ".spago"
203+ then Package <<< PackageName <$> dirs !! 1
204+ else do
205+ bowerDirIx <- Array.findIndex (_ == "bower_components") dirs
206+ Package <<< PackageName <$> dirs !! (bowerDirIx + 1)
207+ where dirs = String.split (Pattern "/") name
205208
206209
207210-- | Extract `SearchResults` from a `ChildDeclaration`.
208211resultsForChildDeclaration
209212 :: Scores
210− -> PackageName
213+ -> PackageInfo
211214 -> ModuleName
212215 -> SearchResult
213216 -> ChildDeclaration
214217 -> List { path :: String, result :: SearchResult }
215−resultsForChildDeclaration scores packageName moduleName parentResult
218+resultsForChildDeclaration scores packageInfo moduleName parentResult
216219 child@(ChildDeclaration { title, info, comments, mbSourceSpan })
217220 | Just resultInfo <- mkChildInfo parentResult child =
218221 { path: title
@@ -225,8 +228,8 @@ resultsForChildDeclaration scores packageName moduleName parentResult
225228 , hashAnchor: "v"
226229 , moduleName
227230 , sourceSpan: mbSourceSpan
228− , packageName
229− , score: fromMaybe 0 $ Map.lookup packageName scores
231+ , packageInfo
232+ , score: getPackageScore scores packageInfo
230233 , info: resultInfo
231234 }
232235 } # List.singleton
@@ -261,7 +264,8 @@ mkChildInfo
261264
262265 -- Then we construct a qualified name of the type class.
263266 constraintClass =
264− QualifiedName { moduleName: String.split (wrap ".") moduleName
267+ QualifiedName { moduleNameParts:
268+ String.split (wrap ".") $ unwrap moduleName
265269 , name: resultName }
266270
267271 -- We concatenate two lists:
src/Docs/Search/Engine.purs+10−10
@@ -5,7 +5,7 @@ import Docs.Search.PackageIndex (PackageIndex, PackageResult)
55import Docs.Search.Score (Scores)
66import Docs.Search.SearchResult (SearchResult, typeOfResult)
77import Docs.Search.TypeQuery (TypeQuery(..), parseTypeQuery, penalty)
8−import Docs.Search.Types (PackageName, ModuleName)
8+import Docs.Search.Types (PackageInfo(..), PackageName(..), ModuleName(..))
99
1010import Prelude
1111
@@ -73,25 +73,25 @@ getResultScore (PackResult r) = r.score
7373getResultScore (MdlResult r) = r.score
7474
7575
76−getResultPackageName :: Result -> PackageName
77−getResultPackageName (DeclResult r) = (unwrap r).packageName
78−getResultPackageName (TypeResult r) = (unwrap r).packageName
79−getResultPackageName (PackResult r) = r.name
80−getResultPackageName (MdlResult r) = r.package
76+getResultPackageInfo :: Result -> PackageInfo
77+getResultPackageInfo (DeclResult r) = (unwrap r).packageInfo
78+getResultPackageInfo (TypeResult r) = (unwrap r).packageInfo
79+getResultPackageInfo (PackResult r) = Package r.name
80+getResultPackageInfo (MdlResult r) = Package $ r.package
8181
8282
8383getResultModuleName :: Result -> ModuleName
8484getResultModuleName (DeclResult r) = (unwrap r).moduleName
8585getResultModuleName (TypeResult r) = (unwrap r).moduleName
86−getResultModuleName (PackResult r) = ""
86+getResultModuleName (PackResult r) = ModuleName ""
8787getResultModuleName (MdlResult r) = r.name
8888
8989
9090getResultName :: Result -> String
9191getResultName (DeclResult r) = (unwrap r).name
9292getResultName (TypeResult r) = (unwrap r).name
93−getResultName (PackResult r) = r.name
94−getResultName (MdlResult r) = r.name
93+getResultName (PackResult r) = unwrap r.name
94+getResultName (MdlResult r) = unwrap r.name
9595
9696
9797sortByPopularity
@@ -102,7 +102,7 @@ sortByPopularity
102102sortByPopularity { packageIndex } =
103103 Array.sortBy (
104104 compare `on` (getResultScore >>> negate) <>
105− compare `on` getResultPackageName <>
105+ compare `on` getResultPackageInfo <>
106106 compare `on` getResultModuleName <>
107107 -- Identifier name comes last: we want to make sure no `Result`s are
108108 -- equal, to avoid having unstable ordering.
src/Docs/Search/Interactive.purs+23−17
@@ -1,16 +1,6 @@
11-- | Definitions for the "search REPL".
22module Docs.Search.Interactive where
33
4−import Prelude
5−
6−import Data.Array as Array
7−import Data.Identity (Identity(..))
8−import Data.Maybe (fromMaybe)
9−import Data.Newtype (un, unwrap, wrap)
10−import Data.Search.Trie as Trie
11−import Data.String (length) as String
12−import Data.String.Common (split, trim) as String
13−import Data.Tuple (fst)
144import Docs.Search.Declarations (Declarations, mkDeclarations)
155import Docs.Search.DocsJson (DataDeclType(..))
166import Docs.Search.Engine (mkEngineState, Result(..))
@@ -26,6 +16,18 @@ import Docs.Search.Terminal (bold, cyan, green, yellow)
2616import Docs.Search.TypeDecoder (Constraint, FunDeps, Kind, QualifiedName, Type, TypeArgument)
2717import Docs.Search.TypeIndex (resultsWithTypes)
2818import Docs.Search.TypePrinter (keyword, showConstraint, showFunDeps, showKind, showType, showTypeArgument, space, syntax)
19+import Docs.Search.Types (PackageName, ModuleName, PackageInfo, packageInfoToString)
20+
21+import Prelude
22+
23+import Data.Array as Array
24+import Data.Identity (Identity(..))
25+import Data.Maybe (fromMaybe)
26+import Data.Newtype (un, unwrap, wrap)
27+import Data.Search.Trie as Trie
28+import Data.String (length) as String
29+import Data.String.Common (split, trim) as String
30+import Data.Tuple (fst)
2931import Effect (Effect)
3032import Effect.Aff (launchAff_)
3133import Effect.Class (liftEffect)
@@ -122,33 +124,37 @@ showResult = case _ of
122124
123125
124126showSearchResult :: SearchResult -> String
125−showSearchResult (SearchResult result@{ name, comments, moduleName, packageName }) =
127+showSearchResult (SearchResult result@{ name, comments, moduleName, packageInfo }) =
126128 showSignature result <> "\n" <>
127129
128130 (fromMaybe "\n" $
129131 comments <#> \comment ->
130132 "\n" <> leftShift 3 (String.trim comment) <> "\n\n") <>
131133
132− bold (cyan (rightPad 40 packageName)) <> space <> bold (green moduleName)
134+ bold (
135+ cyan (rightPad 40 $ packageInfoToString packageInfo)
136+ ) <>
137+ space <>
138+ bold (green $ unwrap moduleName)
133139
134140
135141showPackageResult :: PackageResult -> String
136142showPackageResult { name, description } =
137− bold (cyan "package") <> " " <> bold (yellow name) <>
143+ bold (cyan "package") <> " " <> bold (yellow $ unwrap name) <>
138144
139145 (description >#> \text -> "\n\n" <> leftShift 3 text <> "\n")
140146
141147
142148showModuleResult :: ModuleResult -> String
143149showModuleResult { name, package } =
144− bold (cyan "module") <> " " <> bold (green name)
150+ bold (cyan "module") <> " " <> bold (green $ unwrap name)
145151
146152
147153showSignature ::
148154 forall rest.
149155 { name :: String
150− , moduleName :: String
151− , packageName :: String
156+ , moduleName :: ModuleName
157+ , packageInfo :: PackageInfo
152158 , info :: ResultInfo
153159 | rest
154160 }
@@ -185,7 +191,7 @@ showTypeClassSignature
185191 , arguments :: Array TypeArgument
186192 , superclasses :: Array Constraint
187193 }
188− -> { name :: String, moduleName :: String | rest }
194+ -> { name :: String, moduleName :: ModuleName | rest }
189195 -> String
190196showTypeClassSignature { fundeps, arguments, superclasses } { name, moduleName } =
191197
src/Docs/Search/ModuleIndex.purs+9−6
@@ -3,9 +3,9 @@ module Docs.Search.ModuleIndex where
33import Docs.Search.Config (config)
44import Docs.Search.Declarations (Declarations(..))
55import Docs.Search.SearchResult (SearchResult(..))
6−import Docs.Search.Types (ModuleName, PackageName)
6+import Docs.Search.Types (ModuleName, PackageName, PackageInfo(..))
77import Docs.Search.Extra (stringToList)
8−import Docs.Search.Score (Scores, normalizePackageName)
8+import Docs.Search.Score (Scores)
99
1010import Prelude
1111
@@ -22,6 +22,7 @@ import Data.List (List, (:))
2222import Data.Map (Map)
2323import Data.Map as Map
2424import Data.Maybe (fromMaybe)
25+import Data.Newtype (unwrap)
2526import Data.Search.Trie (Trie)
2627import Data.Search.Trie as Trie
2728import Data.Set (Set)
@@ -68,7 +69,9 @@ unpackModuleIndex packageModules =
6869-- | E.g. `"Data.Array.ST" -> ["data.array.st", "array.st", "st"]`.
6970extractModuleNameParts :: ModuleName -> List String
7071extractModuleNameParts =
71− foldl (\acc el -> el : map (_ <> "." <> el) acc) mempty <<< String.split (Pattern ".") <<< String.toLower
72+ unwrap >>> String.toLower >>>
73+ String.split (Pattern ".") >>>
74+ foldl (\acc el -> el : map (_ <> "." <> el) acc) mempty
7275
7376
7477queryModuleIndex
@@ -83,7 +86,7 @@ queryModuleIndex scores { index, modulePackages } query =
8386 Array.nub <#>
8487 (\name -> do
8588 package <- Map.lookup name modulePackages
86− pure { name, package, score: fromMaybe 0 $ Map.lookup (normalizePackageName package) scores }) #
89+ pure { name, package, score: fromMaybe 0 $ Map.lookup package scores }) #
8790 Array.catMaybes
8891
8992
@@ -97,9 +100,9 @@ mkPackedModuleIndex (Declarations trie) =
97100 -> Map PackageName (Set ModuleName)
98101 extract = foldr (Map.unionWith Set.union) mempty <<< map mkEntry
99102 where
100− mkEntry (SearchResult { packageName, moduleName }) =
103+ mkEntry (SearchResult { packageInfo: Package packageName, moduleName }) =
101104 Map.singleton packageName (Set.singleton moduleName)
102−
105+ mkEntry _ = mempty
103106
104107loadModuleIndex :: Aff PackedModuleIndex
105108loadModuleIndex = do
src/Docs/Search/PackageIndex.purs+15−12
@@ -2,7 +2,8 @@ module Docs.Search.PackageIndex where
22
33import Docs.Search.Config (config)
44import Docs.Search.Extra (stringToList)
5−import Docs.Search.Score (Scores, getPackageScore, normalizePackageName)
5+import Docs.Search.Score (Scores, getPackageScoreForPackageName, normalizePackageName)
6+import Docs.Search.Types (PackageName, RawPackageName(..))
67
78import Prelude
89
@@ -23,10 +24,10 @@ import Web.Bower.PackageMeta (PackageMeta(..))
2324
2425
2526type PackageResult
26− = { name :: String
27+ = { name :: PackageName
2728 , description :: Maybe String
2829 , score :: Int
29− , dependencies :: Array String
30+ , dependencies :: Array PackageName
3031 , repository :: Maybe String
3132 }
3233
@@ -44,24 +45,26 @@ mkPackageInfo packageScores pms =
4445 where
4546 insert
4647 :: PackageMeta
47− -> Map String PackageResult
48− -> Map String PackageResult
48+ -> Map PackageName PackageResult
49+ -> Map PackageName PackageResult
4950 insert
5051 (PackageMeta { name
5152 , description
5253 , dependencies
5354 , devDependencies
5455 , repository }) =
55−
56− Map.insert
57− name
58− { name
56+ Map.insert
57+ packageName
58+ { name: packageName
5959 , description: description
60− , score: getPackageScore packageScores $ normalizePackageName name
61− , dependencies: unwrap dependencies <#> (_.packageName)
60+ , score: getPackageScoreForPackageName packageScores packageName
61+ , dependencies:
62+ unwrap dependencies <#>
63+ (_.packageName >>> RawPackageName >>> normalizePackageName)
6264 , repository: repository <#> (_.url)
6365 }
6466
67+ where packageName = normalizePackageName $ RawPackageName name
6568
6669mkScoresFromPackageIndex :: PackageIndex -> Scores
6770mkScoresFromPackageIndex =
@@ -78,7 +81,7 @@ loadPackageIndex = do
7881mkPackageIndex :: PackageInfo -> PackageIndex
7982mkPackageIndex =
8083 Array.foldr
81− (\package -> Trie.insert (stringToList $ normalizePackageName package.name) package)
84+ (\package -> Trie.insert (stringToList $ unwrap package.name) package)
8285 mempty
8386
8487
src/Docs/Search/Score.purs+17−12
@@ -1,6 +1,6 @@
11module Docs.Search.Score where
22
3−import Docs.Search.Types (PackageName)
3+import Docs.Search.Types (RawPackageName(..), PackageName(..), PackageInfo(..))
44
55import Prelude
66
@@ -15,16 +15,9 @@ import Web.Bower.PackageMeta (Dependencies, PackageMeta)
1515
1616type Scores = Map PackageName Int
1717
18−
19−getPackageScore :: Scores -> PackageName -> Int
20−getPackageScore _ "<builtin>" = 1000000
21−getPackageScore _ "<local package>" = 2000000
22−getPackageScore scores name = fromMaybe 0 $ Map.lookup name scores
23−
24−
25−normalizePackageName :: PackageName -> PackageName
26−normalizePackageName packageName =
27− fromMaybe packageName $ String.stripPrefix (wrap "purescript-") packageName
18+normalizePackageName :: RawPackageName -> PackageName
19+normalizePackageName (RawPackageName p) =
20+ fromMaybe (PackageName p) $ map wrap $ String.stripPrefix (wrap "purescript-") p
2821
2922
3023-- | Construct a mapping from package names to their scores, based on number
@@ -44,4 +37,16 @@ mkScores =
4437 Array.foldr
4538 (\dep -> Map.insertWith add dep 1)
4639 scores
47− (deps # unwrap >>> map (_.packageName >>> normalizePackageName))
40+ (deps # unwrap >>> map (_.packageName >>> RawPackageName >>> normalizePackageName))
41+
42+
43+getPackageScore :: Scores -> PackageInfo -> Int
44+getPackageScore scores = case _ of
45+ Package p -> getPackageScoreForPackageName scores p
46+ Builtin -> 100000
47+ LocalPackage -> 200000
48+ UnknownPackage -> 0
49+
50+
51+getPackageScoreForPackageName :: Scores -> PackageName -> Int
52+getPackageScoreForPackageName scores p = fromMaybe 0 $ Map.lookup p scores
src/Docs/Search/SearchResult.purs+3−2
@@ -2,6 +2,7 @@ module Docs.Search.SearchResult where
22
33import Docs.Search.DocsJson (DataDeclType)
44import Docs.Search.TypeDecoder (Constraint, FunDeps, Kind, QualifiedName, Type, TypeArgument)
5+import Docs.Search.Types (PackageName, PackageInfo, ModuleName)
56
67import Prelude
78
@@ -59,8 +60,8 @@ newtype SearchResult
5960 { name :: String
6061 , comments :: Maybe String
6162 , hashAnchor :: String
62− , moduleName :: String
63− , packageName :: String
63+ , moduleName :: ModuleName
64+ , packageInfo :: PackageInfo
6465 , score :: Int
6566 , sourceSpan :: Maybe { start :: Array Int
6667 , end :: Array Int
src/Docs/Search/TypeDecoder.purs+4−4
@@ -25,20 +25,20 @@ instance showQualifiedName :: Show QualifiedName where
2525 show = genericShow
2626
2727newtype QualifiedName
28− = QualifiedName { moduleName :: Array String
28+ = QualifiedName { moduleNameParts :: Array String
2929 , name :: String
3030 }
3131
3232instance decodeJsonQualifiedName :: DecodeJson QualifiedName where
3333 decodeJson json = do
3434 decodeTuple
35− (\moduleName name -> QualifiedName { moduleName, name })
35+ (\moduleNameParts name -> QualifiedName { moduleNameParts, name })
3636 (mkJsonError "QualifiedName" json)
3737 json
3838
3939instance encodeJsonQualifiedName :: EncodeJson QualifiedName where
40− encodeJson (QualifiedName { moduleName, name }) =
41− encodeTuple moduleName name
40+ encodeJson (QualifiedName { moduleNameParts, name }) =
41+ encodeTuple moduleNameParts name
4242
4343mkJsonError :: String -> Json -> (forall i. i -> String)
4444mkJsonError name json _ =
src/Docs/Search/TypeIndex.purs+3−1
@@ -8,6 +8,7 @@ import Docs.Search.Score (Scores)
88import Docs.Search.SearchResult (ResultInfo(..), SearchResult(..))
99import Docs.Search.TypeDecoder (Type)
1010import Docs.Search.TypeQuery (TypeQuery)
11+import Docs.Search.Types (ModuleName(..))
1112import Docs.Search.TypeShape (shapeOfType, shapeOfTypeQuery, stringifyShape)
1213
1314import Prelude
@@ -48,7 +49,8 @@ mkTypeIndex scores docsJsons =
4849
4950allResults :: Scores -> DocsJson -> Array SearchResult
5051allResults scores (DocsJson { name, declarations }) =
51− declarations >>= (resultsForDeclaration scores name >>> map (_.result) >>> Array.fromFoldable)
52+ declarations >>= (resultsForDeclaration scores (ModuleName name) >>>
53+ map (_.result) >>> Array.fromFoldable)
5254
5355
5456resultsWithTypes :: Scores -> DocsJson -> Array SearchResult
src/Docs/Search/TypePrinter.purs+2−2
@@ -21,13 +21,13 @@ showType = case _ of
2121 TypeOp qname -> showQualifiedName qname
2222
2323 TypeApp (TypeApp (TypeConstructor
24− (QualifiedName { moduleName: [ "Prim" ]
24+ (QualifiedName { moduleNameParts: [ "Prim" ]
2525 , name: "Function" }))
2626 t1)
2727 t2 ->
2828 showType t1 <> syntax " -> " <> showType t2
2929
30− TypeApp (TypeConstructor (QualifiedName { moduleName: [ "Prim" ]
30+ TypeApp (TypeConstructor (QualifiedName { moduleNameParts: [ "Prim" ]
3131 , name: "Record" }))
3232 row ->
3333 showRow false row
src/Docs/Search/TypeQuery.purs+3−3
@@ -248,7 +248,7 @@ unify query type_ = go Nil (List.singleton { q: query, t: type_ })
248248 -- * Functions
249249 go acc ({ q: QFun q1 q2
250250 , t: TypeApp (TypeApp (TypeConstructor
251− (QualifiedName { moduleName: [ "Prim" ]
251+ (QualifiedName { moduleNameParts: [ "Prim" ]
252252 , name: "Function" })) t1) t2 } : rest) =
253253 go acc ({ q: q1, t: t1 } : { q: q2, t: t2 } : rest)
254254 go acc ({ q: q@(QFun q1 q2), t } : rest) =
@@ -257,7 +257,7 @@ unify query type_ = go Nil (List.singleton { q: query, t: type_ })
257257 -- * Rows
258258 go acc ({ q: QApp (QConst "Record") (QRow qRows)
259259 , t: TypeApp (TypeConstructor
260− (QualifiedName { moduleName: [ "Prim" ]
260+ (QualifiedName { moduleNameParts: [ "Prim" ]
261261 , name: "Record" })) row } : rest) =
262262 let { rows, ty } = joinRows row
263263 qRowsLength = List.length qRows
@@ -407,7 +407,7 @@ typeSize = go 0 <<< List.singleton
407407 go n (TypeOp _ : rest) =
408408 go (n + 1) rest
409409 go n (TypeApp (TypeApp (TypeConstructor
410− (QualifiedName { moduleName: [ "Prim" ]
410+ (QualifiedName { moduleNameParts: [ "Prim" ]
411411 , name: "Function" })) t1) t2 : rest) =
412412 go (n + 1) (t1 : t2 : rest)
413413 go n (TypeApp q1 q2 : rest) =
src/Docs/Search/TypeShape.purs+1−1
@@ -101,7 +101,7 @@ shapeOfType ty = List.reverse $ go (pure ty) Nil
101101 TypeWildcard ->
102102 go rest (PVar : acc)
103103
104− TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Prim"]
104+ TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"]
105105 , name: "Function" })) t1) t2 ->
106106 go (t1 : t2 : rest) (PFun : acc)
107107
src/Docs/Search/Types.purs+56−2
@@ -1,5 +1,59 @@
11module Docs.Search.Types where
22
3−type ModuleName = String
3+import Prelude
44
5−type PackageName = String
5+import Data.Argonaut.Decode (class DecodeJson)
6+import Data.Argonaut.Decode.Generic.Rep (genericDecodeJson)
7+import Data.Argonaut.Encode (class EncodeJson)
8+import Data.Argonaut.Encode.Generic.Rep (genericEncodeJson)
9+import Data.Generic.Rep (class Generic)
10+import Data.Generic.Rep.Show (genericShow)
11+import Data.Newtype (class Newtype)
12+
13+
14+newtype ModuleName = ModuleName String
15+
16+derive instance newtypeModuleName :: Newtype ModuleName _
17+derive instance genericModuleName :: Generic ModuleName _
18+derive newtype instance eqModuleName :: Eq ModuleName
19+derive newtype instance ordModuleName :: Ord ModuleName
20+derive newtype instance decodeJsonModuleName :: DecodeJson ModuleName
21+derive newtype instance encodeJsonModuleName :: EncodeJson ModuleName
22+
23+
24+-- | Non-normalized package name, e.g. `purescript-prelude` or just `prelude`.
25+newtype RawPackageName = RawPackageName String
26+
27+derive instance newtypeRawPackageName :: Newtype RawPackageName _
28+
29+
30+-- | Normalized package name without "purescript-" prefix.
31+newtype PackageName = PackageName String
32+
33+derive instance newtypePackageName :: Newtype PackageName _
34+derive newtype instance eqPackageName :: Eq PackageName
35+derive newtype instance ordPackageName :: Ord PackageName
36+derive newtype instance showPackageName :: Show PackageName
37+derive newtype instance decodeJsonPackageName :: DecodeJson PackageName
38+derive newtype instance encodeJsonPackageName :: EncodeJson PackageName
39+derive instance genericPackageName :: Generic PackageName _
40+
41+
42+data PackageInfo = Package PackageName | Builtin | LocalPackage | UnknownPackage
43+
44+derive instance eqPackageInfo :: Eq PackageInfo
45+derive instance ordPackageInfo :: Ord PackageInfo
46+derive instance genericPackageInfo :: Generic PackageInfo _
47+instance showPackageInfo :: Show PackageInfo where
48+ show = genericShow
49+
50+instance decodeJsonPackageInfo :: DecodeJson PackageInfo where
51+ decodeJson = genericDecodeJson
52+instance encodeJsonPackageInfo :: EncodeJson PackageInfo where
53+ encodeJson = genericEncodeJson
54+
55+packageInfoToString :: PackageInfo -> String
56+packageInfoToString (Package (PackageName p)) = p
57+packageInfoToString Builtin = "<builtin>"
58+packageInfoToString LocalPackage = "<local package>"
59+packageInfoToString UnknownPackage = "<unknown package>"
test/Main.purs+16−16
@@ -67,7 +67,7 @@ mainTest = do
6767 """
6868
6969 assertRight (decodeJson qualifiedName)
70− (QualifiedName { moduleName: ["Prim"]
70+ (QualifiedName { moduleNameParts: ["Prim"]
7171 , name: "Type"
7272 }
7373 )
@@ -87,7 +87,7 @@ mainTest = do
8787 """
8888
8989 assertRight (decodeJson namedKind)
90− (NamedKind $ QualifiedName { moduleName: ["Prim"]
90+ (NamedKind $ QualifiedName { moduleNameParts: ["Prim"]
9191 , name: "Type"
9292 }
9393 )
@@ -111,7 +111,7 @@ mainTest = do
111111 """
112112
113113 assertRight (decodeJson row)
114− (Row $ NamedKind $ QualifiedName { moduleName: ["Prim"]
114+ (Row $ NamedKind $ QualifiedName { moduleNameParts: ["Prim"]
115115 , name: "Type"
116116 }
117117 )
@@ -154,11 +154,11 @@ mainTest = do
154154 }
155155 """
156156 assertRight (decodeJson funKind)
157− (FunKind (Row $ NamedKind $ QualifiedName { moduleName: ["Prim"]
157+ (FunKind (Row $ NamedKind $ QualifiedName { moduleNameParts: ["Prim"]
158158 , name: "Type"
159159 }
160160 )
161− (Row $ NamedKind $ QualifiedName { moduleName: ["Prim"]
161+ (Row $ NamedKind $ QualifiedName { moduleNameParts: ["Prim"]
162162 , name: "Type"
163163 }
164164 )
@@ -181,7 +181,7 @@ mainTest = do
181181 }
182182 """
183183 assertRight (decodeJson constraint)
184− (Constraint { constraintClass: QualifiedName { moduleName: ["Prim"]
184+ (Constraint { constraintClass: QualifiedName { moduleNameParts: ["Prim"]
185185 , name: "Partial"
186186 }
187187 , constraintArgs: []
@@ -230,7 +230,7 @@ mainTest = do
230230
231231 assertRight (decodeJson typeApp1) $
232232 TypeApp
233− (TypeConstructor (QualifiedName { moduleName:
233+ (TypeConstructor (QualifiedName { moduleNameParts:
234234 [ "Control"
235235 , "Monad"
236236 , "ST"
@@ -256,7 +256,7 @@ mainTest = do
256256 }
257257 """
258258 assertRight (decodeJson typeOp) $
259− TypeOp $ QualifiedName { moduleName: [ "Data", "NaturalTransformation" ]
259+ TypeOp $ QualifiedName { moduleNameParts: [ "Data", "NaturalTransformation" ]
260260 , name: "~>"
261261 }
262262
@@ -293,7 +293,7 @@ mainTest = do
293293
294294 assertRight (decodeJson binaryNoParens) $
295295 BinaryNoParensType
296− (TypeOp $ QualifiedName { moduleName: ["Data", "NaturalTransformation"], name: "~>" })
296+ (TypeOp $ QualifiedName { moduleNameParts: ["Data", "NaturalTransformation"], name: "~>" })
297297 (TypeVar "m")
298298 (TypeVar "n")
299299
@@ -335,14 +335,14 @@ mainTest = do
335335 assertRight (decodeJson parensInType) $
336336 ParensInType $
337337 TypeApp
338− (TypeConstructor (QualifiedName { moduleName:
338+ (TypeConstructor (QualifiedName { moduleNameParts:
339339 [ "Data"
340340 , "Maybe"
341341 ],
342342 name: "Maybe"
343343 }
344344 ))
345− (TypeConstructor (QualifiedName { moduleName:
345+ (TypeConstructor (QualifiedName { moduleNameParts:
346346 [ "Prim"
347347 ],
348348 name: "String"
@@ -389,7 +389,7 @@ mainTest = do
389389 assertRight (decodeJson rcons) $
390390 RCons
391391 "tail"
392− (TypeApp (TypeConstructor $ QualifiedName { moduleName: [ "Data", "Symbol" ], name: "SProxy" })
392+ (TypeApp (TypeConstructor $ QualifiedName { moduleNameParts: [ "Data", "Symbol" ], name: "SProxy" })
393393 (TypeVar "t"))
394394 REmpty
395395
@@ -545,8 +545,8 @@ mainTest = do
545545 """
546546 assertRight (decodeJson forallJson) $
547547 ForAll "f"
548− (Just (FunKind (NamedKind (QualifiedName { moduleName: ["Prim","RowList"], name: "RowList" })) (NamedKind (QualifiedName { moduleName: ["Prim"], name: "Type" }))))
549− (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Prim"], name: "Function" })) (TypeApp (TypeVar "f") (TypeVar "l"))) (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Data","List","Types"], name: "List" })) (ParensInType (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Data","Tuple"], name: "Tuple" })) (TypeConstructor (QualifiedName { moduleName: ["Prim"], name: "String" }))) (TypeConstructor (QualifiedName { moduleName: ["Prim"], name: "String" }))))))
548+ (Just (FunKind (NamedKind (QualifiedName { moduleNameParts: ["Prim","RowList"], name: "RowList" })) (NamedKind (QualifiedName { moduleNameParts: ["Prim"], name: "Type" }))))
549+ (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"], name: "Function" })) (TypeApp (TypeVar "f") (TypeVar "l"))) (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Data","List","Types"], name: "List" })) (ParensInType (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Data","Tuple"], name: "Tuple" })) (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"], name: "String" }))) (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"], name: "String" }))))))
550550
551551
552552
@@ -558,7 +558,7 @@ mainTest = do
558558{"annotation":[],"tag":"ForAll","contents":["o",{"annotation":[],"tag":"ForAll","contents":["r",{"annotation":[],"tag":"ForAll","contents":["l",{"annotation":[],"tag":"ConstrainedType","contents":[{"constraintAnn":[],"constraintClass":[["Type","Data","Boolean"],"And"],"constraintArgs":[{"annotation":[],"tag":"TypeVar","contents":"l"},{"annotation":[],"tag":"TypeVar","contents":"r"},{"annotation":[],"tag":"TypeVar","contents":"o"}],"constraintData":null},{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeConstructor","contents":[["Type","Data","Boolean"],"BProxy"]},{"annotation":[],"tag":"TypeVar","contents":"l"}]}]},{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeConstructor","contents":[["Prim"],"Function"]},{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeConstructor","contents":[["Type","Data","Boolean"],"BProxy"]},{"annotation":[],"tag":"TypeVar","contents":"r"}]}]},{"annotation":[],"tag":"TypeApp","contents":[{"annotation":[],"tag":"TypeConstructor","contents":[["Type","Data","Boolean"],"BProxy"]},{"annotation":[],"tag":"TypeVar","contents":"o"}]}]}]}]},null]},null]},null]}
559559 """
560560
561− assertRight (decodeJson json) $ (ForAll "o" Nothing (ForAll "r" Nothing (ForAll "l" Nothing (ConstrainedType (Constraint { constraintArgs: [(TypeVar "l"),(TypeVar "r"),(TypeVar "o")], constraintClass: (QualifiedName { moduleName: ["Type","Data","Boolean"], name: "And" }) }) (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Prim"], name: "Function" })) (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "l"))) (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Prim"], name: "Function" })) (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "r"))) (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "o"))))))))
561+ assertRight (decodeJson json) $ (ForAll "o" Nothing (ForAll "r" Nothing (ForAll "l" Nothing (ConstrainedType (Constraint { constraintArgs: [(TypeVar "l"),(TypeVar "r"),(TypeVar "o")], constraintClass: (QualifiedName { moduleNameParts: ["Type","Data","Boolean"], name: "And" }) }) (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"], name: "Function" })) (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "l"))) (TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"], name: "Function" })) (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "r"))) (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Type","Data","Boolean"], name: "BProxy" })) (TypeVar "o"))))))))
562562
563563 suite "Kind encoder" do
564564 test "FunKind" do
@@ -570,4 +570,4 @@ mainTest = do
570570
571571
572572qualified :: Array String -> String -> QualifiedName
573−qualified moduleName name = QualifiedName { moduleName, name }
573+qualified moduleNameParts name = QualifiedName { moduleNameParts, name }
test/Test/Declarations.purs+14−11
@@ -2,8 +2,11 @@ module Test.Declarations where
22
33import Prelude
44
5−import Data.Maybe (Maybe(..))
65import Docs.Search.Declarations (extractPackageName)
6+import Docs.Search.Types (PackageName(..), PackageInfo(..))
7+
8+import Data.Maybe (Maybe(..))
9+import Data.Newtype (wrap)
710
811import Test.Unit (TestSuite, suite, test)
912import Test.Unit.Assert as Assert
@@ -12,26 +15,26 @@ tests :: TestSuite
1215tests = do
1316 suite "Declarations" do
1417 test "extractPackageName" do
15− Assert.equal "<builtin>" (extractPackageName "Prim" Nothing)
16− Assert.equal "<builtin>" (extractPackageName "Prim.Foo" Nothing)
17− Assert.equal "<builtin>" (extractPackageName "Prim.Foo.Bar" Nothing)
18− Assert.equal "<unknown>" (extractPackageName "Primitive" Nothing)
19− Assert.equal "foo"
20− (extractPackageName "Foo" $
18+ Assert.equal Builtin (extractPackageName (wrap "Prim") Nothing)
19+ Assert.equal Builtin (extractPackageName (wrap "Prim.Foo") Nothing)
20+ Assert.equal Builtin (extractPackageName (wrap "Prim.Foo.Bar") Nothing)
21+ Assert.equal UnknownPackage (extractPackageName (wrap "Primitive") Nothing)
22+ Assert.equal (Package $ PackageName "foo")
23+ (extractPackageName (wrap "Foo") $
2124 Just { start: []
2225 , end: []
2326 , name: ".spago/foo/src/Foo.purs"
2427 }
2528 )
26− Assert.equal "bar"
27− (extractPackageName "Bar" $
29+ Assert.equal (Package $ PackageName "bar")
30+ (extractPackageName (wrap "Bar") $
2831 Just { start: []
2932 , end: []
3033 , name: "/path/to/somewhere/bower_components/bar/src/Bar.purs"
3134 }
3235 )
33− Assert.equal "<local package>"
34− (extractPackageName "Bar" $
36+ Assert.equal LocalPackage
37+ (extractPackageName (wrap "Bar") $
3538 Just { start: []
3639 , end: []
3740 , name: "/path/to/somewhere/src/Bar.purs"
test/Test/ModuleIndex.purs+3−2
@@ -5,6 +5,7 @@ import Docs.Search.ModuleIndex (extractModuleNameParts)
55import Prelude
66
77import Data.List as List
8+import Data.Newtype (wrap)
89import Test.Unit (TestSuite, suite, test)
910import Test.Unit.Assert as Assert
1011
@@ -14,11 +15,11 @@ tests = do
1415 suite "ModuleIndex" do
1516
1617 test "test #0" do
17− Assert.equal (extractModuleNameParts "Data.Array.ST") (
18+ Assert.equal (extractModuleNameParts $ wrap "Data.Array.ST") (
1819 List.fromFoldable [ "st", "array.st", "data.array.st" ]
1920 )
2021
2122 test "test #1" do
22− Assert.equal (extractModuleNameParts "Foo") (
23+ Assert.equal (extractModuleNameParts $ wrap "Foo") (
2324 List.fromFoldable [ "foo" ]
2425 )
test/Test/TypeQuery.purs+3−3
@@ -245,7 +245,7 @@ tests = do
245245 c2 = constr (qname [""] "GenericEq") [TypeVar "rep"]
246246
247247 fun t1 t2 =
248− TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleName: ["Prim"]
248+ TypeApp (TypeApp (TypeConstructor (QualifiedName { moduleNameParts: ["Prim"]
249249 , name: "Function" })) t1) t2
250250 type_ =
251251 ForAll "a" Nothing $
@@ -391,7 +391,7 @@ nl :: forall t5 t6. Foldable t6 => t5 -> t6 t5 -> NonEmptyList t5
391391nl x rst = NonEmptyList.cons' x $ List.fromFoldable rst
392392
393393unitType :: Type
394−unitType = TypeConstructor (QualifiedName { moduleName: []
394+unitType = TypeConstructor (QualifiedName { moduleNameParts: []
395395 , name: "Unit"
396396 })
397397
@@ -399,7 +399,7 @@ countFreeVars :: TypeQuery -> Int
399399countFreeVars = getFreeVariables >>> Set.size
400400
401401qname :: Array String -> String -> QualifiedName
402−qname m n = QualifiedName { moduleName: m, name: n }
402+qname m n = QualifiedName { moduleNameParts: m, name: n }
403403
404404constr :: QualifiedName -> Array Type -> Constraint
405405constr c a = Constraint { constraintClass: c, constraintArgs: a }