@@ -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(..))
4142import Data.String as String
4243import Data.Symbol (class IsSymbol , reflectSymbol )
4344import Prim.Row as Row
44- import Prim.RowList (RowList , class RowToList , Cons , Nil )
45+ import Prim.RowList (class RowToList , Cons , Nil , RowList )
4546import Record as Record
4647import Routing.Duplex.Parser (RouteParser )
4748import Routing.Duplex.Parser as Parser
@@ -167,7 +168,6 @@ segment = RouteDuplex Printer.put Parser.take
167168param :: String -> RouteDuplex' String
168169param 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 )
201210many1 (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 )
214224many (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 {}
314324record = 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 }
326337prop 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
356367class 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
363374instance buildParamsCons ::
364375 ( IsSymbol sym
@@ -378,4 +389,4 @@ instance buildParamsCons ::
378389
379390instance buildParamsNil ::
380391 RouteDuplexBuildParams Nil r1 r2 r3 r3 where
381- buildParams _ _ = identity
392+ buildParams _ _ = identity
0 commit comments