@@ -82,6 +82,9 @@ module Obelisk.Route
8282 , renderObeliskRoute
8383 , renderBackendRoute
8484 , renderFrontendRoute
85+ , readShowEncoder
86+ , integralEncoder
87+ , pathSegmentEncoder
8588 ) where
8689
8790import Prelude hiding ((.), id)
@@ -118,6 +121,7 @@ import qualified Data.Text as T
118121import Data.Text.Encoding
119122import Data.Universe
120123import Network.HTTP.Types.URI
124+import qualified Numeric.Lens
121125import Obelisk.Route.TH
122126import Text.Read (readMaybe)
123127
@@ -859,4 +863,20 @@ renderObeliskRoute e r =
859863 enc = (pageNameEncoder . hoistParse (pure . runIdentity) e)
860864 in (T.pack . uncurry (<>)) $ encode enc r
861865
866+readShowEncoder :: (MonadError Text parse, Read a, Show a, Applicative check) => Encoder check parse a PageName
867+readShowEncoder = singlePathSegmentEncoder . unsafeTshowEncoder
868+
869+
870+integralEncoder :: (MonadError Text parse, Applicative check, Integral a) => Encoder check parse a Integer
871+integralEncoder = prismEncoder (Numeric.Lens.integral)
872+
873+pathSegmentEncoder :: (MonadError Text parse, Applicative check) =>
874+ Encoder check parse (Text, PageName) PageName
875+pathSegmentEncoder = unsafeMkEncoder EncoderImpl
876+ { _encoderImpl_encode = \(x, (y, z)) -> (x:y, z)
877+ , _encoderImpl_decode = \(xss, y) -> case xss of
878+ [] -> throwError "not enough path segments"
879+ (x:xs) -> pure (x, (xs, y))
880+ }
881+
862882--TODO: decodeURIComponent as appropriate