@@ -135,6 +135,7 @@ import Control.Lens
135135 , Prism'
136136 , prism'
137137 , re
138+ , review
138139 , view
139140 , Wrapped (..)
140141 )
@@ -378,8 +379,8 @@ instance (Monad parse, Applicative check) => Bifunctor Either (Encoder check par
378379 bimap f g = Encoder $ liftA2 bimap (unEncoder f) (unEncoder g)
379380
380381instance (Applicative check, Monad parse) => Associative (Encoder check parse) Either where
381− associate = viewEncoder (iso disassociate (associate @(->) @Either))
382− disassociate = viewEncoder (iso associate disassociate)
382+ associate = viewEncoder (iso (associate @(->) @Either) disassociate)
383+ disassociate = viewEncoder (iso disassociate associate)
383384
384385instance (Monad parse, Applicative check) => Braided (Encoder check parse) Either where
385386 braid = viewEncoder (iso swap swap)
@@ -435,23 +436,18 @@ instance (Applicative check, Monad parse) => Monoidal (Encoder check parse) (,)
435436-- Specific instances of encoders
436437--------------------------------------------------------------------------------
437438
438−{-# DEPRECATED isoEncoder "Use viewEncoder instead" #-}
439439-- | Given a valid 'Iso' from lens, construct an 'Encoder'
440−isoEncoder :: (Applicative check, Applicative parse) => Iso' a b -> Encoder check parse a b
441−isoEncoder p = viewEncoder (from p)
442−
443−-- | Given a valid 'Iso' from lens, construct an 'Encoder'
444−viewEncoder :: (Applicative check, Applicative parse) => Iso' a b -> Encoder check parse b a
440+viewEncoder :: (Applicative check, Applicative parse) => Iso' a b -> Encoder check parse a b
445441viewEncoder f = unsafeMkEncoder $ EncoderImpl
446− { _encoderImpl_encode = view (from f)
447− , _encoderImpl_decode = pure . view f
442+ { _encoderImpl_encode = view f
443+ , _encoderImpl_decode = pure . view (from f)
448444 }
449445
450446wrappedEncoder :: (Wrapped a, Applicative check, Applicative parse) => Encoder check parse (Unwrapped a) a
451−wrappedEncoder = viewEncoder _Wrapped'
447+wrappedEncoder = viewEncoder $ from _Wrapped'
452448
453449unwrappedEncoder :: (Wrapped a, Applicative check, Applicative parse) => Encoder check parse a (Unwrapped a)
454−unwrappedEncoder = viewEncoder $ from _Wrapped'
450+unwrappedEncoder = viewEncoder $ _Wrapped'
455451
456452maybeToEitherEncoder :: (Applicative check, Applicative parse) => Encoder check parse (Maybe a) (Either () a)
457453maybeToEitherEncoder = unsafeMkEncoder $ EncoderImpl
@@ -832,19 +828,18 @@ _R
832828 -> Prism' (R f) a
833829_R variant = dSumGEqPrism variant . iso runIdentity Identity
834830
835−{-# DEPRECATED prismEncoder "Use reviewEncoder instead" #-}
836831-- | An encoder that only works on the items available via the prism. An error will be thrown in the parse monad
837832-- if the prism doesn't match.
838−-- This encoder is contravariant like 'review': @prismEncoder (f . g) = prismEncoder g . prismEncoder f@
839−prismEncoder :: (Applicative check, MonadError Text parse) => Prism' b a -> Encoder check parse a b
840−prismEncoder = reviewEncoder
841−
842−-- | An encoder that only works on the items available via the prism. An error will be thrown in the parse monad
843−-- if the prism doesn't match.
844−-- This encoder is contravariant like 'review': @reviewEncoder (f . g) = reviewEncoder g . reviewEncoder f@
833+--
834+-- Note that a 'Prism' from @a@ to @b@ will produce an 'Encoder' from @b@ to @a@
835+-- (i.e. 'reviewEncoder' is a contravariant functor from the category of prisms to the category of encoders),
836+-- just like 'review' produces a function @b -> a@. This is because 'Prism's extract values, in a way that might
837+-- fail, in their forward direction and inject values, in a way that cannot fail, in their reverse direction;
838+-- whereas 'Encoder's encode, which cannot fail, in their forward direction, and decode, which can fail, in their
839+-- reverse direction. In short @reviewEncoder (f . g) = prismEncoder g . reviewEncoder f@.
845840reviewEncoder :: (Applicative check, MonadError Text parse) => Prism' b a -> Encoder check parse a b
846841reviewEncoder p = unsafeMkEncoder $ EncoderImpl
847− { _encoderImpl_encode= view (re p)
842+ { _encoderImpl_encode = review p
848843 , _encoderImpl_decode = \r -> case r ^? p of
849844 Just a -> pure a
850845 Nothing -> throwError "reviewEncoder: value is not present in the prism"
@@ -1043,17 +1038,6 @@ void1Encoder = Encoder $ pure $ EncoderImpl
10431038instance GShow Void1 where
10441039 gshowsPrec _ = \case {}
10451040
1046−concat <$> mapM deriveRouteComponent
1047− [ ''ResourceRoute
1048− , ''JSaddleWarpRoute
1049− , ''IndexOnlyRoute
1050− ]
1051−
1052−makePrisms ''ObeliskRoute
1053−makePrisms ''FullRoute
1054−deriveGEq ''Void1
1055−deriveGCompare ''Void1
1056−
10571041-- | Given a backend route and a checked route encoder, render the route (path
10581042-- and query string). See 'checkEncoder' for how to produce a checked encoder.
10591043renderBackendRoute
@@ -1197,3 +1181,34 @@ byteStringsToPageName p q =
11971181 in decode pageNameEncoder' (T.unpack (T.decodeUtf8 p), T.unpack (T.decodeUtf8 q))
11981182
11991183--TODO: decodeURIComponent as appropriate
1184+
1185+
1186+{-# DEPRECATED isoEncoder "Instead of 'isoEncoder f', use 'viewEncoder f'" #-}
1187+-- | Given a valid 'Iso' from lens, construct an 'Encoder'
1188+isoEncoder :: (Applicative check, Applicative parse) => Iso' a b -> Encoder check parse a b
1189+isoEncoder = viewEncoder
1190+
1191+{-# DEPRECATED prismEncoder "Instead of 'prismEncoder f', use 'reviewEncoder f'" #-}
1192+-- | An encoder that only works on the items available via the prism. An error will be thrown in the parse monad
1193+-- if the prism doesn't match.
1194+--
1195+-- Note that a 'Prism' from @a@ to @b@ will produce an 'Encoder' from @b@ to @a@
1196+-- (i.e. 'prismEncoder' is a contravariant functor from the category of prisms to the category of encoders),
1197+-- just like 'review' produces a function @b -> a@. This is because 'Prism's extract values, in a way that might
1198+-- fail, in their forward direction and inject values, in a way that cannot fail, in their reverse direction;
1199+-- whereas 'Encoder's encode, which cannot fail, in their forward direction, and decode, which can fail, in their
1200+-- reverse direction. In short @prismEncoder (f . g) = prismEncoder g . prismEncoder f@.
1201+prismEncoder :: (Applicative check, MonadError Text parse) => Prism' b a -> Encoder check parse a b
1202+prismEncoder = reviewEncoder
1203+
1204+
1205+concat <$> mapM deriveRouteComponent
1206+ [ ''ResourceRoute
1207+ , ''JSaddleWarpRoute
1208+ , ''IndexOnlyRoute
1209+ ]
1210+
1211+makePrisms ''ObeliskRoute
1212+makePrisms ''FullRoute
1213+deriveGEq ''Void1
1214+deriveGCompare ''Void1