product-profunctors-0.9.0.0: Data/Profunctor/Product/Adaptor.hs
-- |
--
-- Adaptors generalize traversals in two ways:
--
-- - they may focus on values of different types;
--
-- - the type of transformation is an abstract product profunctor @p a b@,
-- rather than a function type @a -> f b@.
--
-- > (a -> f b) -> (a, a) -> f (b, b) -- Traversal
-- > (p a1 b1, p a2 b2) -> p (a1, a2) (b1, b2) -- Adaptor
--
-- This module provides a generic implementation of adaptors
-- and a type synonym for convenience.
--
-- === Example
--
-- @
-- {-\# LANGUAGE DeriveGeneric \#-}
-- import "GHC.Generics"
--
-- data Foo a b c = Foo { fooA :: a, fooB :: b, fooC :: c } deriving 'GHC.Generics.Generic'
--
-- pFoo :: 'Data.Profunctor.Product.ProductProfunctor' p => 'Adaptor' p (Foo (p a a') (p b b') (p c c'))
-- pFoo = 'genericAdaptor'
-- @
--
-- is equivalent to
--
-- @
-- pFoo :: 'Data.Profunctor.Product.ProductProfunctor' p =>
-- Foo (p a a') (p b b') (p c c') -> p (Foo a b c) (Foo a' b' c')
-- pFoo (Foo a b c) = Foo
-- 'Data.Profunctor.Product.***$' 'Data.Profunctor.lmap' fooA a
-- 'Data.Profunctor.Product.****' 'Data.Profunctor.lmap' fooB b
-- 'Data.Profunctor.Product.****' 'Data.Profunctor.lmap' fooC c
-- @
--
-- To use the type synonym 'Adaptor' in versions of GHC older than 8.0.1,
-- @Foo@ must be an instance of 'Unzippable'. You may simply declare a
-- default instance:
--
-- @
-- instance 'Unzippable' Foo
-- @
module Data.Profunctor.Product.Adaptor
( genericAdaptor
, Adaptor
, Unzippable
) where
import Data.Profunctor.Product.Internal.Adaptor