git.iko.soy/rowtype-yoga/purescript-docs-search
on master help sign in
Add local package modules and Prim* to the sidebar

More newtype wrappers.

commit853ace81127af90028c0370f6edd322b5f63328f authorklntsky <klntsky@gmail.com> dateTue 4 Aug 2020, 14:55 (6 years ago) parent73a6c09
11 files changed+92−100
src/Docs/Search/App.purs+2−2 src/Docs/Search/App/Sidebar.purs+18−8 src/Docs/Search/BrowserEngine.purs+8−9 src/Docs/Search/Config.purs+23−18 src/Docs/Search/Engine.purs+1−1 src/Docs/Search/IndexBuilder.purs+7−7 src/Docs/Search/Meta.purs+2−2 src/Docs/Search/ModuleIndex.purs+12−13 src/Docs/Search/PackageIndex.js−24 src/Docs/Search/PackageIndex.purs+4−15 src/Docs/Search/Types.purs+15−1
src/Docs/Search/App.purs+2−2
@@ -103,8 +103,8 @@ main = do
103103 addEventListener hashchange listener true (Window.toEventTarget win)
104104
105105 sbio <- do
106− component <- Sidebar.mkComponent moduleIndex.packageModules isIndexHTML
107− runUI component unit sidebarContainer
106+ component <- Sidebar.mkComponent moduleIndex.packageModules isIndexHTML meta
107+ runUI component unit sidebarContainer
108108
109109 -- Subscribe to window focus events
110110 H.liftEffect do
src/Docs/Search/App/Sidebar.purs+18−8
@@ -1,8 +1,9 @@
11module Docs.Search.App.Sidebar where
22
33import Docs.Search.Config as Config
4+import Docs.Search.Meta (Meta)
45import Docs.Search.ModuleIndex (PackedModuleIndex)
5−import Docs.Search.Types (ModuleName, PackageName(..))
6+import Docs.Search.Types (ModuleName, PackageInfo(..), PackageName)
67
78import Prelude
89
@@ -43,10 +44,11 @@ data IsIndexHTML = IsIndexHTML | NotIndexHTML
4344
4445derive instance isIndexHTMLEq :: Eq IsIndexHTML
4546
46−type State = { moduleIndex :: Map PackageName (Set ModuleName)
47+type State = { moduleIndex :: Map PackageInfo (Set ModuleName)
4748 , groupingMode :: GroupingMode
4849 , moduleNames :: Array ModuleName
4950 , isIndexHTML :: IsIndexHTML
51+ , localPackageName :: PackageName
5052 }
5153
5254
@@ -54,8 +56,9 @@ mkComponent
5456 :: forall i
5557 . PackedModuleIndex
5658 -> IsIndexHTML
59+ -> Meta
5760 -> Aff (H.Component HH.HTML Query i Action Aff)
58−mkComponent moduleIndex isIndexHTML = do
61+mkComponent moduleIndex isIndexHTML { localPackageName } = do
5962 groupingMode <- H.liftEffect loadGroupingModeFromLocalStorage
6063 pure $
6164 H.mkComponent
@@ -63,6 +66,7 @@ mkComponent moduleIndex isIndexHTML = do
6366 , groupingMode
6467 , moduleNames
6568 , isIndexHTML
69+ , localPackageName
6670 }
6771 , render
6872 , eval: H.mkEval $ H.defaultEval { handleAction = handleAction
@@ -105,7 +109,7 @@ render
105109 :: forall m
106110 . State
107111 -> H.ComponentHTML Action () m
108−render { moduleIndex, groupingMode, moduleNames, isIndexHTML } =
112+render { moduleIndex, groupingMode, moduleNames, isIndexHTML, localPackageName } =
109113
110114 HH.div [ HP.classes [ wrap "col"
111115 , wrap $ if isIndexHTML == IsIndexHTML
@@ -133,10 +137,16 @@ render { moduleIndex, groupingMode, moduleNames, isIndexHTML } =
133137 ]
134138 where
135139
136− renderPackageEntry (PackageName packageName /\ modules) =
140+ renderPackageEntry (package /\ modules) =
137141 HH.li [ HP.classes [ wrap "li-package" ] ]
138− [ HH.details_
139− [ HH.summary_ [ HH.text packageName ]
142+ [ HH.details_ $
143+ [ HH.summary_ [ HH.text $
144+ case package of
145+ Package packageName -> unwrap packageName
146+ LocalPackage -> unwrap localPackageName
147+ Builtin -> "Built-in"
148+ UnknownPackage -> "Unknown package"
149+ ]
140150 , HH.ul_ $ Set.toUnfoldable modules <#> renderModuleName
141151 ]
142152 ]
@@ -147,7 +157,7 @@ render { moduleIndex, groupingMode, moduleNames, isIndexHTML } =
147157 [ HH.text $ unwrap moduleName ]
148158 ]
149159
150− packageList :: Array (PackageName /\ Set ModuleName)
160+ packageList :: Array (PackageInfo /\ Set ModuleName)
151161 packageList = Map.toUnfoldable moduleIndex
152162
153163
src/Docs/Search/BrowserEngine.purs+8−9
@@ -7,6 +7,7 @@ import Docs.Search.Engine (Engine, EngineState, Index)
77import Docs.Search.SearchResult (SearchResult)
88import Docs.Search.TypeIndex (TypeIndex)
99import Docs.Search.TypeIndex as TypeIndex
10+import Docs.Search.Types (PartId(..), URL)
1011import Docs.Search.ModuleIndex as ModuleIndex
1112
1213import Prelude
@@ -32,7 +33,7 @@ import Effect.Aff (Aff, try)
3233
3334
3435newtype PartialIndex
35− = PartialIndex (Map Int Index)
36+ = PartialIndex (Map PartId Index)
3637
3738derive instance newtypePartialIndex :: Newtype PartialIndex _
3839derive newtype instance semigroupPartialIndex :: Semigroup PartialIndex
@@ -52,13 +53,11 @@ query
5253 -> Aff { index :: PartialIndex, results :: Array SearchResult }
5354query index@(PartialIndex indexMap) input = do
5455 let
55− path :: List Char
5656 path =
5757 List.fromFoldable $
5858 String.toCharArray $
5959 input
6060
61− partId :: Int
6261 partId = getPartId path
6362
6463 case Map.lookup partId indexMap of
@@ -119,16 +118,16 @@ browserSearchEngine =
119118
120119
121120-- | Find in which part of the index this path can be found.
122−getPartId :: List Char -> Int
121+getPartId :: List Char -> PartId
123122getPartId (a : b : _) =
124− (Char.toCharCode a + Char.toCharCode b) `mod` Config.numberOfIndexParts
123+ PartId $ (Char.toCharCode a + Char.toCharCode b) `mod` Config.numberOfIndexParts
125124getPartId (a : _) =
126− Char.toCharCode a `mod` Config.numberOfIndexParts
127−getPartId _ = 0
125+ PartId $ Char.toCharCode a `mod` Config.numberOfIndexParts
126+getPartId _ = PartId 0
128127
129128
130129-- | Load a part of the index by injecting a <script> tag into the DOM.
131130foreign import loadIndex_
132− :: Int
133− -> String
131+ :: PartId
132+ -> URL
134133 -> Effect (Promise Json)
src/Docs/Search/Config.purs+23−18
@@ -1,8 +1,10 @@
11module Docs.Search.Config where
22
3+import Docs.Search.Types (GlobalIdentifier, PackageName, PartId, URL, FilePath)
4+
35import Prelude
46
5−import Docs.Search.Types
7+import Data.Newtype (wrap)
68
79version :: String
810version = "0.0.9"
@@ -14,40 +16,43 @@ mkShapeScriptPath shape = "./index/types/" <> shape <> ".js"
1416numberOfIndexParts :: Int
1517numberOfIndexParts = 50
1618
17−mkIndexPartPath :: Int -> String
19+mkIndexPartPath :: PartId -> String
1820mkIndexPartPath partId = "html/index/declarations/" <> show partId <> ".js"
1921
20−mkIndexPartLoadPath :: Int -> String
21−mkIndexPartLoadPath partId = "./index/declarations/" <> show partId <> ".js"
22+mkIndexPartLoadPath :: PartId -> URL
23+mkIndexPartLoadPath partId = wrap $ "./index/declarations/" <> show partId <> ".js"
2224
23−moduleIndexPath :: String
24−moduleIndexPath = "generated-docs/html/index/modules.js"
25+moduleIndexPath :: FilePath
26+moduleIndexPath = wrap "generated-docs/html/index/modules.js"
2527
2628-- | Used to load mode index to the browser scope.
2729moduleIndexLoadPath :: String
2830moduleIndexLoadPath = "./index/modules.js"
2931
30−typeIndexDirectory :: String
31−typeIndexDirectory = "generated-docs/html/index/types"
32+typeIndexDirectory :: FilePath
33+typeIndexDirectory = wrap "generated-docs/html/index/types"
3234
33−metaPath :: String
34−metaPath = "generated-docs/html/index/meta.js"
35+metaPath :: FilePath
36+metaPath = wrap "generated-docs/html/index/meta.js"
3537
3638metaLoadPath :: URL
37−metaLoadPath = URL "./index/meta.js"
39+metaLoadPath = wrap "./index/meta.js"
3840
39−metaItem :: String
40−metaItem = "DocsSearchMeta"
41+metaItem :: GlobalIdentifier
42+metaItem = wrap "DocsSearchMeta"
4143
4244-- | localStorage key to save sidebar checkbox value to.
4345groupModulesItem :: String
4446groupModulesItem = "PureScriptDocsSearchGroupModules"
4547
46−packageInfoPath :: String
47−packageInfoPath = "generated-docs/html/index/packages.js"
48+packageInfoPath :: FilePath
49+packageInfoPath = wrap "generated-docs/html/index/packages.js"
50+
51+packageInfoItem :: GlobalIdentifier
52+packageInfoItem = wrap "DocsSearchPackageIndex"
4853
49−packageInfoLoadPath :: String
50−packageInfoLoadPath = "./index/packages.js"
54+packageInfoLoadPath :: URL
55+packageInfoLoadPath = wrap "./index/packages.js"
5156
5257-- | How many results to show by default?
5358resultsCount :: Int
@@ -77,4 +82,4 @@ penalties =
7782 }
7883
7984defaultPackageName :: PackageName
80−defaultPackageName = PackageName "<local package>"
85+defaultPackageName = wrap "<local package>"
src/Docs/Search/Engine.purs+1−1
@@ -77,7 +77,7 @@ getResultPackageInfo :: Result -> PackageInfo
7777getResultPackageInfo (DeclResult r) = (unwrap r).packageInfo
7878getResultPackageInfo (TypeResult r) = (unwrap r).packageInfo
7979getResultPackageInfo (PackResult r) = Package r.name
80−getResultPackageInfo (MdlResult r) = Package $ r.package
80+getResultPackageInfo (MdlResult r) = r.package
8181
8282
8383getResultModuleName :: Result -> ModuleName
src/Docs/Search/IndexBuilder.purs+7−7
@@ -10,7 +10,7 @@ import Docs.Search.PackageIndex (PackageInfo, mkPackageInfo)
1010import Docs.Search.Score (mkScores)
1111import Docs.Search.SearchResult (SearchResult)
1212import Docs.Search.TypeIndex (TypeIndex, mkTypeIndex)
13−import Docs.Search.Types (PackageName)
13+import Docs.Search.Types (PackageName, PartId)
1414import Docs.Search.Meta (Meta)
1515
1616import Prelude
@@ -209,7 +209,7 @@ decodeBowerJsons { bowerFiles } = do
209209writeTypeIndex :: Config -> TypeIndex -> Aff Unit
210210writeTypeIndex { generatedDocs } typeIndex =
211211 for_ entries \(Tuple typeShape results) -> do
212− writeTextFile UTF8 (Config.typeIndexDirectory <> "/" <> typeShape <> ".js")
212+ writeTextFile UTF8 (unwrap Config.typeIndexDirectory <> "/" <> typeShape <> ".js")
213213 (mkHeader typeShape <> stringify (encodeJson results))
214214 where
215215 mkHeader typeShape =
@@ -222,7 +222,7 @@ writeTypeIndex { generatedDocs } typeIndex =
222222writePackageInfo :: PackageInfo -> Aff Unit
223223writePackageInfo packageInfo = do
224224
225− writeTextFile UTF8 Config.packageInfoPath $
225+ writeTextFile UTF8 (unwrap Config.packageInfoPath) $
226226 header <> stringify (encodeJson packageInfo)
227227
228228 where
@@ -231,20 +231,20 @@ writePackageInfo packageInfo = do
231231
232232writeModuleIndex :: PackedModuleIndex -> Aff Unit
233233writeModuleIndex moduleIndex = do
234− writeTextFile UTF8 Config.moduleIndexPath $
234+ writeTextFile UTF8 (unwrap Config.moduleIndexPath) $
235235 header <> stringify (encodeJson moduleIndex)
236236 where
237237 header = "window.DocsSearchModuleIndex = "
238238
239239writeMeta :: Meta -> Aff Unit
240240writeMeta meta = do
241− writeTextFile UTF8 Config.metaPath $
241+ writeTextFile UTF8 (unwrap Config.metaPath) $
242242 header <> stringify (encodeJson meta)
243243 where
244− header = "window." <> Config.metaItem <> " = "
244+ header = "window." <> unwrap Config.metaItem <> " = "
245245
246246-- | Get a mapping from index parts to index contents.
247−getIndex :: Declarations -> Map Int (Array (Tuple String (Array SearchResult)))
247+getIndex :: Declarations -> Map PartId (Array (Tuple String (Array SearchResult)))
248248getIndex (Declarations trie) =
249249 Array.foldr insert mempty parts
250250 where
src/Docs/Search/Meta.purs+2−2
@@ -2,7 +2,7 @@ module Docs.Search.Meta where
22
33import Docs.Search.Config as Config
44import Docs.Search.Loader as Loader
5−import Docs.Search.Types (GlobalIdentifier(..), PackageName)
5+import Docs.Search.Types (PackageName)
66
77import Prelude
88
@@ -16,6 +16,6 @@ type Meta =
1616
1717load :: Aff Meta
1818load =
19− Loader.load (GlobalIdentifier Config.metaItem) Config.metaLoadPath
19+ Loader.load Config.metaItem Config.metaLoadPath
2020 `catchError` const (pure defaultMeta)
2121 where defaultMeta = { localPackageName: Config.defaultPackageName }
src/Docs/Search/ModuleIndex.purs+12−13
@@ -3,9 +3,9 @@ module Docs.Search.ModuleIndex where
33import Docs.Search.Config as Config
44import Docs.Search.Declarations (Declarations(..))
55import Docs.Search.SearchResult (SearchResult(..))
6−import Docs.Search.Types (ModuleName, PackageName, PackageInfo(..), PackageScore)
6+import Docs.Search.Types (ModuleName, PackageInfo, PackageScore)
77import Docs.Search.Extra (stringToList)
8−import Docs.Search.Score (Scores, getPackageScoreForPackageName)
8+import Docs.Search.Score (Scores, getPackageScore)
99
1010import Prelude
1111
@@ -38,18 +38,18 @@ import Effect.Aff (Aff)
3838
3939
4040-- | Module index that is actually stored in a JS file.
41−type PackedModuleIndex = Map PackageName (Set ModuleName)
41+type PackedModuleIndex = Map PackageInfo (Set ModuleName)
4242
4343-- | "Expanded" module index that can be queried quickly.
44−type ModuleIndex = { packageModules :: Map PackageName (Set ModuleName)
45− , modulePackages :: Map ModuleName PackageName
44+type ModuleIndex = { packageModules :: Map PackageInfo (Set ModuleName)
45+ , modulePackages :: Map ModuleName PackageInfo
4646 , index :: Trie Char ModuleName
4747 }
4848
4949
5050type ModuleResult
5151 = { name :: ModuleName
52− , package :: PackageName
52+ , package :: PackageInfo
5353 , score :: PackageScore
5454 }
5555
@@ -58,9 +58,9 @@ unpackModuleIndex :: PackedModuleIndex -> ModuleIndex
5858unpackModuleIndex packageModules =
5959 flip execState { packageModules, modulePackages: mempty, index: mempty } do
6060 for_ (Map.toUnfoldableUnordered packageModules :: Array _)
61− \(packageName /\ moduleNames) -> do
61+ \(package /\ moduleNames) -> do
6262 for_ moduleNames \moduleName -> do
63− modify_ $ _modulePackages %~ Map.insert moduleName packageName
63+ modify_ $ _modulePackages %~ Map.insert moduleName package
6464 for_ (extractModuleNameParts moduleName) \part -> do
6565 let partPath = Array.toUnfoldable $ String.toCharArray part
6666 modify_ $ _index %~ Trie.insert partPath moduleName
@@ -87,7 +87,7 @@ queryModuleIndex scores { index, modulePackages } query =
8787 (\name -> do
8888 package <- Map.lookup name modulePackages
8989 pure { name, package
90− , score: getPackageScoreForPackageName scores package }) #
90+ , score: getPackageScore scores package }) #
9191 Array.catMaybes
9292
9393
@@ -98,12 +98,11 @@ mkPackedModuleIndex (Declarations trie) =
9898 where
9999 extract
100100 :: List SearchResult
101− -> Map PackageName (Set ModuleName)
101+ -> Map PackageInfo (Set ModuleName)
102102 extract = foldr (Map.unionWith Set.union) mempty <<< map mkEntry
103103 where
104− mkEntry (SearchResult { packageInfo: Package packageName, moduleName }) =
105− Map.singleton packageName (Set.singleton moduleName)
106− mkEntry _ = mempty
104+ mkEntry (SearchResult { packageInfo, moduleName }) =
105+ Map.singleton packageInfo (Set.singleton moduleName)
107106
108107loadModuleIndex :: Aff PackedModuleIndex
109108loadModuleIndex = do
src/Docs/Search/PackageIndex.jsdeleted−24
@@ -1,24 +0,0 @@
1−/* global exports */
2−
3−exports.load = function (url) {
4− return function () {
5− return new Promise(function (resolve, reject) {
6− if (typeof window.DocsSearchPackageIndex === 'undefined') {
7− var script = document.createElement('script');
8− script.type = 'text/javascript';
9− script.src = url;
10− script.addEventListener('load', function () {
11− if (typeof window.DocsSearchPackageIndex === 'undefined') {
12− reject(new Error("Couldn't load package index."));
13− } else {
14− resolve(window.DocsSearchPackageIndex);
15− }
16− });
17− script.addEventListener('error', reject);
18− document.body.appendChild(script);
19− } else {
20− resolve(window.DocsSearchPackageIndex);
21− }
22− });
23− };
24−};
src/Docs/Search/PackageIndex.purs+4−15
@@ -4,21 +4,17 @@ import Docs.Search.Config as Config
44import Docs.Search.Extra (stringToList)
55import Docs.Search.Score (Scores, getPackageScoreForPackageName, normalizePackageName)
66import Docs.Search.Types (PackageName, RawPackageName(..), PackageScore)
7+import Docs.Search.Loader as Loader
78
89import Prelude
910
10−import Control.Promise (Promise, toAffE)
11−import Data.Argonaut.Core (Json)
12−import Data.Argonaut.Decode (decodeJson)
1311import Data.Array as Array
14−import Data.Either (hush)
1512import Data.Map (Map)
1613import Data.Map as Map
17−import Data.Maybe (Maybe, fromMaybe)
14+import Data.Maybe (Maybe)
1815import Data.Newtype (unwrap)
1916import Data.Search.Trie (Trie)
2017import Data.Search.Trie as Trie
21−import Effect (Effect)
2218import Effect.Aff (Aff)
2319import Web.Bower.PackageMeta (PackageMeta(..))
2420
@@ -72,10 +68,8 @@ mkScoresFromPackageIndex =
7268
7369
7470loadPackageIndex :: Aff PackageIndex
75−loadPackageIndex = do
76− json <- toAffE (load Config.packageInfoLoadPath)
77− let packageInfo = fromMaybe mempty $ hush $ decodeJson json
78− pure $ mkPackageIndex packageInfo
71+loadPackageIndex =
72+ mkPackageIndex <$> Loader.load Config.packageInfoItem Config.packageInfoLoadPath
7973
8074
8175mkPackageIndex :: PackageInfo -> PackageIndex
@@ -97,8 +91,3 @@ queryPackageIndex index query =
9791 pure { index
9892 , results: Array.fromFoldable $ Trie.queryValues (stringToList query) index
9993 }
100−
101−
102−foreign import load
103− :: String
104− -> Effect (Promise Json)
src/Docs/Search/Types.purs+15−1
@@ -50,7 +50,7 @@ derive newtype instance encodeJsonPackageName :: EncodeJson PackageName
5050derive instance genericPackageName :: Generic PackageName _
5151
5252
53−data PackageInfo = Package PackageName | Builtin | LocalPackage | UnknownPackage
53+data PackageInfo = LocalPackage | Builtin | Package PackageName | UnknownPackage
5454
5555derive instance eqPackageInfo :: Eq PackageInfo
5656derive instance ordPackageInfo :: Ord PackageInfo
@@ -80,8 +80,22 @@ derive newtype instance encodeJsonPackageScore :: EncodeJson PackageScore
8080newtype URL = URL String
8181
8282derive instance newtypeURL :: Newtype URL _
83+derive newtype instance showURL :: Show URL
8384
85+newtype FilePath = FilePath String
86+
87+derive instance newtypeFilePath :: Newtype FilePath _
88+derive newtype instance showFilePath :: Show FilePath
8489
8590newtype GlobalIdentifier = GlobalIdentifier String
8691
8792derive instance newtypeGlobalIdentifier :: Newtype GlobalIdentifier _
93+derive newtype instance showGlobalIdentifier :: Show GlobalIdentifier
94+
95+
96+newtype PartId = PartId Int
97+
98+derive instance newtypePartId :: Newtype PartId _
99+derive newtype instance eqPartId :: Eq PartId
100+derive newtype instance ordPartId :: Ord PartId
101+derive newtype instance showPartId :: Show PartId