@@ -21,6 +21,8 @@
21module Obelisk.Route
21module Obelisk.Route
23 , pattern (:/)
23 , pattern (:/)
25 , PageName
27 , PageName
26 , PathQuery
28 , PathQuery
@@ -43,6 +45,9 @@ module Obelisk.Route
43 , checkEnum1EncoderFunc
45 , checkEnum1EncoderFunc
44 , unitEncoder
46 , unitEncoder
45 , pathOnlyEncoder
47 , pathOnlyEncoder
48+ , addPathSegmentEncoder
46 , singletonListEncoder
51 , singletonListEncoder
47 , unpackTextEncoder
52 , unpackTextEncoder
48 , prefixTextEncoder
53 , prefixTextEncoder
@@ -200,6 +205,48 @@ mapSome f (Some a) = Some $ f a
200hoistR :: (forall x. f x -> g x) -> R f -> R g
205hoistR :: (forall x. f x -> g x) -> R f -> R g
201hoistR f (x :=> Identity y) = f x :/ y
206hoistR f (x :=> Identity y) = f x :/ y
208+--------------------------------------------------------------------------------
209+-- Dealing with pairs (i.e. non-dependently-typed subroutes/paths)
210+--------------------------------------------------------------------------------
215+{-# COMPLETE (:.) #-}
216+pattern (:.) :: a -> b -> a :. b
217+pattern a :. b = (a, b)
219+addPathSegmentEncoder
220+ :: ( Applicative check
221+ , MonadError Text parse
223+ => Encoder check parse (Text, PageName) PageName
224+addPathSegmentEncoder = unsafeMkEncoder $ EncoderImpl
225+ { _encoderImpl_encode = \(ph, (pt, q)) -> (ph : pt, q)
226+ , _encoderImpl_decode = \(p, q) -> case p of
227+ [] -> throwError "Expected a path segment"
228+ ph : pt -> pure (ph, (pt, q))
232+ :: forall check parse item rest.
234+ , MonadError Text parse
236+ => Encoder check parse item Text
237+ -> Encoder check parse rest PageName
238+ -> Encoder check parse (item :. rest) PageName
239+pathParamEncoder itemUnchecked restUnchecked = addPathSegmentEncoder . bimap itemUnchecked restUnchecked
242+ :: ( Applicative check
243+ , MonadError Text parse
246+ -> Encoder check parse a PageName
247+ -> Encoder check parse a PageName
248+pathLiteralEncoder t e = addPathSegmentEncoder . bimap (unitEncoder t) e . coidl
203--------------------------------------------------------------------------------
250--------------------------------------------------------------------------------
204-- Encoder fundamentals
251-- Encoder fundamentals
205--------------------------------------------------------------------------------
252--------------------------------------------------------------------------------