@@ -46,6 +46,8 @@ module Obelisk.Route
4646 , unsafeTshowEncoder
4747 , someConstEncoder
4848 , singlePathSegmentEncoder
49+ , maybeEncoder
50+ , maybeToEitherEncoder
4951 , justEncoder
5052 , nothingEncoder
5153 , isoEncoder
@@ -304,7 +306,28 @@ wrappedEncoder = isoEncoder $ from _Wrapped'
304306unwrappedEncoder :: (Wrapped a, Applicative check, Applicative parse) => Encoder check parse a (Unwrapped a)
305307unwrappedEncoder = isoEncoder _Wrapped'
306308
307−-- | Encodea a value by simply applying 'Just'
309+maybeToEitherEncoder :: (Applicative check, Applicative parse) => Encoder check parse (Maybe a) (Either () a)
310+maybeToEitherEncoder = unsafeMkEncoder $ EncoderImpl
311+ { _encoderImpl_encode = \case
312+ Nothing -> Left ()
313+ Just a -> Right a
314+ , _encoderImpl_decode = pure . \case
315+ Left _ -> Nothing
316+ Right a -> Just a
317+ }
318+
319+maybeEncoder
320+ :: ( MonadError Text check
321+ , Show a
322+ , Show b
323+ , check ~ parse
324+ )
325+ => Encoder check parse () b
326+ -> Encoder check parse a b
327+ -> Encoder check parse (Maybe a) b
328+maybeEncoder f g = shadowEncoder f g . maybeToEitherEncoder
329+
330+-- | Encode a value by simply applying 'Just'
308331justEncoder :: (Applicative check, MonadError Text parse) => Encoder check parse a (Maybe a)
309332justEncoder = prismEncoder _Just
310333
@@ -714,7 +737,7 @@ obeliskRouteEncoder appRouteSegment = pathComponentEncoder $ \r ->
714737obeliskRouteSegment :: forall check parse appRoute a.
715738 (MonadError Text check, MonadError Text parse)
716739 => ObeliskRoute appRoute a
717− -> (forall a. appRoute a -> SegmentResult check parse a)
740+ -> (forall b. appRoute b -> SegmentResult check parse b)
718741 -> SegmentResult check parse a
719742obeliskRouteSegment r appRouteSegment = case r of
720743 ObeliskRoute_App appRoute -> appRouteSegment appRoute