vinyl-plus-0.1.0.0: src/Data/Vinyl/Plus/Internal.hs
module Data.Vinyl.Plus.Internal where
import Data.Profunctor
import Data.Profunctor.Choice
-- | This is copied from 'Control.Lens.Prism'.
prism :: (Choice p, Applicative f) => (b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism bt seta = dimap seta (either pure (fmap bt)) . right'
{-# INLINE prism #-}
-- | This is copied from 'Control.Lens.Prism'.
prism' :: (Choice p, Applicative f) => (b -> s) -> (s -> Maybe a) -> p a (f b) -> p s (f s)
prism' bs sma = prism bs (\s -> maybe (Left s) Right (sma s))
{-# INLINE prism' #-}