Skip to content

Commit 13702d4

Browse files
authored
Merge pull request #30 from natefaubion/housekeeping
Housekeeping, various fixes
2 parents 953c2a1 + e77e7f5 commit 13702d4

File tree

12 files changed

+211
-184
lines changed

12 files changed

+211
-184
lines changed

.github/workflows/ci.yml

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,34 @@ on:
44
push:
55
branches: [master]
66
pull_request:
7-
branches: [master]
87

98
jobs:
109
build:
1110
runs-on: ubuntu-latest
11+
1212
steps:
1313
- uses: actions/checkout@v2
1414

1515
- uses: purescript-contrib/setup-purescript@main
16+
with:
17+
purescript: "0.15.6"
18+
spago: "0.20.9"
19+
psa: "0.8.2"
20+
purs-tidy: "latest"
1621

17-
- uses: actions/setup-node@v2
22+
- name: Cache PureScript dependencies
23+
uses: actions/cache@v2
1824
with:
19-
node-version: "14"
25+
key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }}
26+
path: |
27+
.spago
28+
output
2029
21-
- name: Install dependencies
22-
run: |
23-
npm install -g bower
24-
npm install
25-
bower install --production
2630
- name: Build source
27-
run: spago build
31+
run: spago build --purs-args '--censor-lib --strict'
2832

2933
- name: Run tests
30-
run: |
31-
bower install
32-
spago test
34+
run: spago test
35+
36+
- name: Check formatting
37+
run: purs-tidy check src test

.tidyrc.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"importSort": "ide",
3+
"importWrap": "source",
4+
"indent": 2,
5+
"operatorsFile": null,
6+
"ribbon": 1,
7+
"typeArrowPlacement": "first",
8+
"unicode": "never",
9+
"width": null
10+
}

bower.json

Lines changed: 0 additions & 27 deletions
This file was deleted.

packages.dhall

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
let upstream =
2-
https://github.com/purescript/package-sets/releases/download/psc-0.15.0-20220429/packages.dhall
3-
sha256:03c682bff56fc8f9d8c495ffcc6f524cbd3c89fe04778f965265c08757de8c9d
2+
https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20221124/packages.dhall
3+
sha256:792255bbd8e2141468d967325f3e78246cb7e500bf3ab6d76d5b22dffbb09d49
44

55
in upstream

spago.dhall

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
, dependencies =
33
[ "arrays"
44
, "assert"
5-
, "bifunctors"
65
, "control"
76
, "effect"
87
, "either"
@@ -12,7 +11,6 @@
1211
, "lazy"
1312
, "maybe"
1413
, "newtype"
15-
, "partial"
1614
, "prelude"
1715
, "profunctor"
1816
, "quickcheck"

src/Routing/Duplex.purs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Routing.Duplex
1111
, segment
1212
, param
1313
, flag
14+
, hash
1415
, many1
1516
, many
1617
, rest
@@ -41,7 +42,7 @@ import Data.String (Pattern(..))
4142
import Data.String as String
4243
import Data.Symbol (class IsSymbol, reflectSymbol)
4344
import Prim.Row as Row
44-
import Prim.RowList (RowList, class RowToList, Cons, Nil)
45+
import Prim.RowList (class RowToList, Cons, Nil, RowList)
4546
import Record as Record
4647
import Routing.Duplex.Parser (RouteParser)
4748
import Routing.Duplex.Parser as Parser
@@ -167,7 +168,6 @@ segment = RouteDuplex Printer.put Parser.take
167168
param :: String -> RouteDuplex' String
168169
param p = RouteDuplex (Printer.param p) (Parser.param p)
169170

170-
171171
-- | Consumes or prints a query flag (i.e. parameter without value).
172172
-- | **Note:** that this combinator ignores the value of the parameter. It only cares about its presence/absence.
173173
-- | Presence is interpreted as `true`, absence as `false`.
@@ -185,19 +185,28 @@ flag (RouteDuplex enc dec) = RouteDuplex enc' dec'
185185
enc' _ = mempty
186186
dec' = Parser.default false (dec $> true)
187187

188+
-- | Consumes or prints the URI hash segment.
189+
-- |
190+
-- | ```purescript
191+
-- | parse hash "abc#def" == Right "def"
192+
-- | ```
193+
hash :: RouteDuplex' String
194+
hash = RouteDuplex Printer.hash Parser.hash
195+
188196
-- | Repeatedly applies a given codec to parse one or more values from path segments.
189197
-- | Parsing will fail if no segment can be parsed.
190198
-- |
191199
-- |```purescript
192200
-- | parse (many1 (int segment)) "1/2/3/x" == Right [1,2,3]
193201
-- | parse (many1 (int segment)) "x", == Left (Expected "Int" "x") :: Either RouteError (Array Int)
194202
-- |```
195-
many1 :: forall f a b.
196-
Foldable f =>
197-
Alt f =>
198-
Applicative f =>
199-
RouteDuplex a b ->
200-
RouteDuplex (f a) (f b)
203+
many1
204+
:: forall f a b
205+
. Foldable f
206+
=> Alt f
207+
=> Applicative f
208+
=> RouteDuplex a b
209+
-> RouteDuplex (f a) (f b)
201210
many1 (RouteDuplex enc dec) = RouteDuplex (foldMap enc) (Parser.many1 dec)
202211

203212
-- | Similar to `many1`, except also succeeds when no values can be parsed.
@@ -206,11 +215,12 @@ many1 (RouteDuplex enc dec) = RouteDuplex (foldMap enc) (Parser.many1 dec)
206215
-- | parse (many (int segment)) "1/2/3/x" == Right [1,2,3]
207216
-- | parse (many (int segment)) "x", == Right []
208217
-- |```
209-
many :: forall f a b.
210-
Foldable f =>
211-
Alternative f =>
212-
RouteDuplex a b ->
213-
RouteDuplex (f a) (f b)
218+
many
219+
:: forall f a b
220+
. Foldable f
221+
=> Alternative f
222+
=> RouteDuplex a b
223+
-> RouteDuplex (f a) (f b)
214224
many (RouteDuplex enc dec) = RouteDuplex (foldMap enc) (Parser.many dec)
215225

216226
-- | Consumes or prints all the remaining segments.
@@ -314,15 +324,16 @@ record :: forall r. RouteDuplex r {}
314324
record = RouteDuplex mempty (pure {})
315325

316326
-- | See `record`.
317-
prop :: forall sym a b r1 r2 r3 rx.
318-
IsSymbol sym =>
319-
Row.Cons sym a rx r1 =>
320-
Row.Cons sym b r2 r3 =>
321-
Row.Lacks sym r2 =>
322-
Proxy sym ->
323-
RouteDuplex a b ->
324-
RouteDuplex { | r1 } { | r2 } ->
325-
RouteDuplex { | r1 } { | r3 }
327+
prop
328+
:: forall sym a b r1 r2 r3 rx
329+
. IsSymbol sym
330+
=> Row.Cons sym a rx r1
331+
=> Row.Cons sym b r2 r3
332+
=> Row.Lacks sym r2
333+
=> Proxy sym
334+
-> RouteDuplex a b
335+
-> RouteDuplex { | r1 } { | r2 }
336+
-> RouteDuplex { | r1 } { | r3 }
326337
prop sym (RouteDuplex f g) (RouteDuplex x y) =
327338
RouteDuplex (\r -> x r <> f (Record.get sym r)) (flip (Record.insert sym) <$> y <*> g)
328339

@@ -354,11 +365,11 @@ instance routeDuplexParams ::
354365
# buildParams (Proxy :: Proxy rl) r
355366

356367
class RouteDuplexBuildParams (rl :: RowList Type) (r1 :: Row Type) (r2 :: Row Type) (r3 :: Row Type) (r4 :: Row Type) | rl -> r1 r2 r3 r4 where
357-
buildParams ::
358-
Proxy rl ->
359-
{ | r1 } ->
360-
RouteDuplex { | r2 } { | r3 } ->
361-
RouteDuplex { | r2 } { | r4 }
368+
buildParams
369+
:: Proxy rl
370+
-> { | r1 }
371+
-> RouteDuplex { | r2 } { | r3 }
372+
-> RouteDuplex { | r2 } { | r4 }
362373

363374
instance buildParamsCons ::
364375
( IsSymbol sym
@@ -378,4 +389,4 @@ instance buildParamsCons ::
378389

379390
instance buildParamsNil ::
380391
RouteDuplexBuildParams Nil r1 r2 r3 r3 where
381-
buildParams _ _ = identity
392+
buildParams _ _ = identity

src/Routing/Duplex/Generic.purs

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,43 @@ import Record as Record
1111
import Routing.Duplex (RouteDuplex(..), RouteDuplex', end)
1212
import Type.Proxy (Proxy(..))
1313

14-
sum :: forall a rep r.
15-
Generic a rep =>
16-
GRouteDuplex rep r =>
17-
{ | r } ->
18-
RouteDuplex' a
19-
sum = dimap from to <<< gRouteDuplex
14+
-- | Builds a parser/printer from a record, where each record field corresponds
15+
-- | to a constructor name for your data type.
16+
-- |
17+
-- | Note: this implicitly inserts calls to `end` for each constructor, making
18+
-- | the parser only valid for parsing URI suffixes. To parse URI prefixes, or
19+
-- | to just have more explicit control, use `sumPrefix`.
20+
sum
21+
:: forall a rep r
22+
. Generic a rep
23+
=> GRouteDuplex rep r
24+
=> { | r }
25+
-> RouteDuplex' a
26+
sum = dimap from to <<< gRouteDuplex end
27+
28+
-- | A variation of `sum` that does not implicitly add an `end` to each branch.
29+
-- | This is useful for defining sub-parsers that may consume only some of the
30+
-- | URI segments, leaving the rest for subsequent parsers.
31+
sumPrefix
32+
:: forall a rep r
33+
. Generic a rep
34+
=> GRouteDuplex rep r
35+
=> { | r }
36+
-> RouteDuplex' a
37+
sumPrefix = dimap from to <<< gRouteDuplex identity
2038

2139
class GRouteDuplex rep (r :: Row Type) | rep -> r where
22-
gRouteDuplex :: { | r } -> RouteDuplex' rep
40+
gRouteDuplex :: (forall x y. RouteDuplex x y -> RouteDuplex x y) -> { | r } -> RouteDuplex' rep
2341

2442
instance gRouteSum ::
2543
( GRouteDuplex a r
2644
, GRouteDuplex b r
2745
) =>
2846
GRouteDuplex (Sum a b) r where
29-
gRouteDuplex r = RouteDuplex enc dec
47+
gRouteDuplex end' r = RouteDuplex enc dec
3048
where
31-
RouteDuplex encl decl = gRouteDuplex r
32-
RouteDuplex encr decr = gRouteDuplex r
49+
RouteDuplex encl decl = gRouteDuplex end' r
50+
RouteDuplex encr decr = gRouteDuplex end' r
3351
enc = case _ of
3452
Inl a -> encl a
3553
Inr b -> encr b
@@ -41,10 +59,10 @@ instance gRouteConstructor ::
4159
, GRouteDuplexCtr a b
4260
) =>
4361
GRouteDuplex (Constructor sym b) r where
44-
gRouteDuplex r = RouteDuplex enc dec
62+
gRouteDuplex end' r = RouteDuplex enc dec
4563
where
4664
RouteDuplex enc' dec' =
47-
end
65+
end'
4866
$ (gRouteDuplexCtr :: RouteDuplex' a -> RouteDuplex' b)
4967
$ Record.get (Proxy :: Proxy sym) r
5068
enc (Constructor a) = enc' a
@@ -56,32 +74,30 @@ class GRouteDuplexCtr a b | a -> b where
5674
instance gRouteProduct ::
5775
GRouteDuplexCtr (Product a b) (Product a b) where
5876
gRouteDuplexCtr = identity
59-
else
60-
instance gRouteNoArguments ::
77+
else instance gRouteNoArguments ::
6178
GRouteDuplexCtr NoArguments NoArguments where
6279
gRouteDuplexCtr = identity
63-
else
64-
instance gRouteArgument ::
80+
else instance gRouteArgument ::
6581
GRouteDuplexCtr (Argument a) (Argument a) where
6682
gRouteDuplexCtr = identity
67-
else
68-
instance gRouteAll ::
83+
else instance gRouteAll ::
6984
GRouteDuplexCtr a (Argument a) where
7085
gRouteDuplexCtr (RouteDuplex enc dec) =
7186
RouteDuplex (\(Argument a) -> enc a) (Argument <$> dec)
7287

73-
product :: forall a b c.
74-
GRouteDuplexCtr b c =>
75-
RouteDuplex' a ->
76-
RouteDuplex' b ->
77-
RouteDuplex' (Product (Argument a) c)
88+
product
89+
:: forall a b c
90+
. GRouteDuplexCtr b c
91+
=> RouteDuplex' a
92+
-> RouteDuplex' b
93+
-> RouteDuplex' (Product (Argument a) c)
7894
product (RouteDuplex encl decl) l = RouteDuplex enc dec
7995
where
8096
RouteDuplex encr decr = gRouteDuplexCtr l
8197
enc (Product (Argument a) b) = encl a <> encr b
8298
dec = Product <$> (Argument <$> decl) <*> decr
8399

84-
noArgs:: RouteDuplex' NoArguments
100+
noArgs :: RouteDuplex' NoArguments
85101
noArgs = pure NoArguments
86102

87103
infixr 0 product as ~

src/Routing/Duplex/Generic/Syntax.purs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,15 @@ class GSep a b c | a b -> c where
1212
instance gsepStringString ::
1313
GSep String String Unit where
1414
gsep a b = prefix a $ prefix b $ pure unit
15-
else
16-
instance gsepStringRoute ::
15+
else instance gsepStringRoute ::
1716
GRouteDuplexCtr a b =>
1817
GSep String (RouteDuplex a a) b where
1918
gsep a = prefix a <<< gRouteDuplexCtr
20-
else
21-
instance gsepRouteString ::
19+
else instance gsepRouteString ::
2220
GRouteDuplexCtr a b =>
2321
GSep (RouteDuplex a a) String b where
2422
gsep = suffix <<< gRouteDuplexCtr
25-
else
26-
instance gsepProduct ::
23+
else instance gsepProduct ::
2724
GRouteDuplexCtr b c =>
2825
GSep (RouteDuplex a a) (RouteDuplex b b) (Product (Argument a) c) where
2926
gsep = product
@@ -37,8 +34,7 @@ instance gparamsString ::
3734
RouteDuplexParams r1 r2 =>
3835
GParams String { | r1 } { | r2 } where
3936
gparams a = prefix a <<< params
40-
else
41-
instance gparamsRoute ::
37+
else instance gparamsRoute ::
4238
RouteDuplexParams r1 r2 =>
4339
GParams (RouteDuplex a a) { | r1 } (Product (Argument a) (Argument { | r2 })) where
4440
gparams a = product a <<< params

0 commit comments

Comments
 (0)