Skip to content
This repository was archived by the owner on Jul 19, 2022. It is now read-only.

Commit a9a8c9f

Browse files
committed
Catalog: ensure the catalog is sorted by category
Using the categories CategoryMask (and OrderedDict), sort the Catalog such that it matches the original order in the catalog Doc.
1 parent c829da2 commit a9a8c9f

File tree

4 files changed

+77
-43
lines changed

4 files changed

+77
-43
lines changed

elm.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"elm-community/list-extra": "8.2.4",
2121
"elm-community/maybe-extra": "5.2.0",
2222
"elm-community/string-extra": "4.0.1",
23+
"j-maas/elm-ordered-containers": "1.0.0",
2324
"krisajenkins/remotedata": "6.0.1",
2425
"mgold/elm-nonempty-list": "4.1.0",
2526
"stoeffel/set-extra": "1.2.3",

src/UnisonShare/Catalog.elm

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,38 @@
11
module UnisonShare.Catalog exposing (..)
22

3-
import Dict exposing (Dict)
3+
import Dict
44
import FullyQualifiedName as FQN
55
import Json.Decode as Decode
6+
import OrderedDict exposing (OrderedDict)
67
import Project exposing (ProjectListing)
78
import UnisonShare.Catalog.CatalogMask as CatalogMask exposing (CatalogMask)
89

910

1011
type Catalog
11-
= Catalog (Dict String (List ProjectListing))
12+
= Catalog (OrderedDict String (List ProjectListing))
1213

1314

1415

1516
-- CREATE
1617

1718

19+
{-| Create the empty Catalog
20+
-}
1821
empty : Catalog
1922
empty =
20-
Catalog Dict.empty
23+
Catalog OrderedDict.empty
2124

2225

26+
{-| Create a Catalog using a mask and listings. The mask is used to get the
27+
categories and to ensure the category sort order is preserved
28+
-}
2329
catalog : CatalogMask -> List ProjectListing -> Catalog
2430
catalog mask projectListings_ =
2531
let
26-
catalog_ project ((Catalog dict) as acc) =
32+
group project acc =
2733
let
2834
projectName =
29-
project
30-
|> Project.slug
31-
|> FQN.toString
35+
project |> Project.slug |> FQN.toString
3236

3337
categoryName =
3438
CatalogMask.categoryOf projectName mask
@@ -43,12 +47,39 @@ catalog mask projectListings_ =
4347
in
4448
case categoryName of
4549
Just c ->
46-
Catalog (Dict.update c set dict)
50+
Dict.update c set acc
51+
52+
Nothing ->
53+
acc
54+
55+
grouped =
56+
List.foldl group Dict.empty projectListings_
57+
58+
sortedCategories category acc =
59+
case Dict.get category grouped of
60+
Just ps ->
61+
insert category ps acc
4762

4863
Nothing ->
4964
acc
5065
in
51-
List.foldl catalog_ empty projectListings_
66+
List.foldl sortedCategories empty (CatalogMask.categories mask)
67+
68+
69+
{-| Insert a category and projects within into a Catalog
70+
-}
71+
insert : String -> List ProjectListing -> Catalog -> Catalog
72+
insert categoryName projectListings_ (Catalog dict) =
73+
Catalog (OrderedDict.insert categoryName projectListings_ dict)
74+
75+
76+
{-| Create a Catalog given a list of projects grouped by category
77+
-}
78+
fromList : List ( String, List ProjectListing ) -> Catalog
79+
fromList items =
80+
items
81+
|> OrderedDict.fromList
82+
|> Catalog
5283

5384

5485

@@ -57,22 +88,28 @@ catalog mask projectListings_ =
5788

5889
isEmpty : Catalog -> Bool
5990
isEmpty (Catalog dict) =
60-
Dict.isEmpty dict
91+
OrderedDict.isEmpty dict
6192

6293

94+
{-| Extract all categories from a Catalog
95+
-}
6396
categories : Catalog -> List String
6497
categories (Catalog dict) =
65-
Dict.keys dict
98+
OrderedDict.keys dict
6699

67100

101+
{-| Extract all project listings from a Catalog
102+
-}
68103
projectListings : Catalog -> List ProjectListing
69104
projectListings (Catalog dict) =
70-
List.concat (Dict.values dict)
105+
List.concat (OrderedDict.values dict)
71106

72107

108+
{-| Convert a Catalog to a list of project listings grouped by category
109+
-}
73110
toList : Catalog -> List ( String, List ProjectListing )
74111
toList (Catalog dict) =
75-
Dict.toList dict
112+
OrderedDict.toList dict
76113

77114

78115

src/UnisonShare/Catalog/CatalogMask.elm

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ module UnisonShare.Catalog.CatalogMask exposing
1212
)
1313

1414
import Definition.Doc as Doc exposing (Doc)
15-
import Dict exposing (Dict)
1615
import Json.Decode as Decode exposing (field, index)
1716
import List.Extra as ListE
17+
import OrderedDict exposing (OrderedDict)
1818

1919

2020
{-| CatalogMask is used to create the Catalog and map ProjectListings to their
@@ -24,7 +24,7 @@ Indexed by project to category "unison.http" -> "Web & Networking"
2424
2525
-}
2626
type CatalogMask
27-
= CatalogMask (Dict String String)
27+
= CatalogMask (OrderedDict String String)
2828

2929

3030

@@ -33,12 +33,12 @@ type CatalogMask
3333

3434
empty : CatalogMask
3535
empty =
36-
CatalogMask Dict.empty
36+
CatalogMask OrderedDict.empty
3737

3838

3939
fromList : List ( String, String ) -> CatalogMask
4040
fromList categories_ =
41-
CatalogMask (Dict.fromList categories_)
41+
CatalogMask (OrderedDict.fromList categories_)
4242

4343

4444
{-| For right now, a CatalogMask is fetched as a Doc from the server and as
@@ -78,27 +78,27 @@ fromDoc doc =
7878

7979
isEmpty : CatalogMask -> Bool
8080
isEmpty (CatalogMask mask) =
81-
Dict.isEmpty mask
81+
OrderedDict.isEmpty mask
8282

8383

8484
categoryOf : String -> CatalogMask -> Maybe String
8585
categoryOf projectName (CatalogMask mask) =
86-
Dict.get projectName mask
86+
OrderedDict.get projectName mask
8787

8888

8989
categories : CatalogMask -> List String
9090
categories (CatalogMask mask) =
91-
Dict.values mask |> ListE.unique
91+
OrderedDict.values mask |> ListE.unique
9292

9393

9494
projectNames : CatalogMask -> List String
9595
projectNames (CatalogMask mask) =
96-
Dict.keys mask
96+
OrderedDict.keys mask
9797

9898

9999
toList : CatalogMask -> List ( String, String )
100100
toList (CatalogMask mask) =
101-
Dict.toList mask
101+
OrderedDict.toList mask
102102

103103

104104

tests/UnisonShare/Catalog/CatalogMaskTests.elm

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ fromDoc =
1111
describe "CatalogMask.fromDoc"
1212
[ test "Creates a CatalogMask from a Doc" <|
1313
\_ ->
14-
Expect.equal (List.sort rawMask)
15-
(CatalogMask.fromDoc doc |> CatalogMask.toList |> List.sort)
14+
Expect.equal rawMask
15+
(CatalogMask.fromDoc doc |> CatalogMask.toList)
1616
]
1717

1818

@@ -25,8 +25,8 @@ fromList =
2525
catalogMask =
2626
CatalogMask.fromList rawMask
2727
in
28-
Expect.equal (List.sort rawMask)
29-
(CatalogMask.toList catalogMask |> List.sort)
28+
Expect.equal rawMask
29+
(CatalogMask.toList catalogMask)
3030
]
3131

3232

@@ -53,14 +53,12 @@ categories =
5353
CatalogMask.fromList rawMask
5454
in
5555
Expect.equal
56-
(List.sort
57-
[ "Featured"
58-
, "Web & Networking"
59-
, "Parsers & Text Manipulation"
60-
, "Datatypes"
61-
]
62-
)
63-
(CatalogMask.categories catalogMask |> List.sort)
56+
[ "Featured"
57+
, "Web & Networking"
58+
, "Parsers & Text Manipulation"
59+
, "Datatypes"
60+
]
61+
(CatalogMask.categories catalogMask)
6462
]
6563

6664

@@ -74,15 +72,13 @@ projectNames =
7472
CatalogMask.fromList rawMask
7573
in
7674
Expect.equal
77-
(List.sort
78-
[ "unison.base"
79-
, "unison.distributed"
80-
, "unison.http"
81-
, "hojberg.textExtra"
82-
, "hojberg.nanoid"
83-
]
84-
)
85-
(CatalogMask.projectNames catalogMask |> List.sort)
75+
[ "unison.base"
76+
, "unison.distributed"
77+
, "unison.http"
78+
, "hojberg.textExtra"
79+
, "hojberg.nanoid"
80+
]
81+
(CatalogMask.projectNames catalogMask)
8682
]
8783

8884

0 commit comments

Comments
 (0)