I have a function called:
mapRouteEncoder ::
Prism' FilePath FilePath ->
Prism' r1 r2 ->
(b -> a) ->
RouteEncoder a r1 ->
RouteEncoder b r2
This function is often used by specifying "identity" prisms (if we can call it that) in the first two arguments because only the 3rd function is specified, viz.:
stringRouteEncoder
& mapRouteEncoder (prism' id Just) (prism' id Just) changeModel
I use optics-core
, and is there anything in that library to replace prism' id Just
something more idiomatic?
CodePudding user response:
I'm not familiar with the idioms for that package, but I'd be tempted to use castOptic equality
to turn the identity Iso
into a Prism
. That seems to get the idea across pretty well. However, I would expect that in most contexts you wouldn't actually need to convert it to a Prism
; you can presumably use polymorphic functions (like preview
and review
) that will accept an Iso
as well as a Prism
.
In your case, I suspect the right approach would be to write something like
mapRouteEncoder ::
( p1 `Is` A_Prism
, p2 `Is` A_Prism) =>
Optic' p1 ixy1 FilePath FilePath ->
Optic' p2 ixy2 r1 r2 ->
(b -> a) ->
RouteEncoder a r1 ->
RouteEncoder b r2