optics-core-0.1: src/Optics/Coerce.hs
-- |
-- Module: Optics.Coerce
-- Description: Operators to 'coerce' the type parameters of 'Optic'.
--
-- This module defines operations to 'coerce' the type parameters of optics to
-- a representationally equal type. For example, if we have
--
-- > newtype MkInt = MkInt Int
--
-- and
--
-- > l :: Lens' S Int
--
-- then
--
-- > coerceA @Int @MkInt l :: Lens' S MkInt
--
module Optics.Coerce
( coerceS
, coerceT
, coerceA
, coerceB
) where
import Data.Coerce
import Optics.Internal.Optic
import Optics.Internal.Profunctor
-- | Lift 'coerce' to the @s@ parameter of an optic.
coerceS
:: Coercible s s'
=> Optic k is s t a b
-> Optic k is s' t a b
coerceS = \(Optic o) -> Optic (lcoerce . o)
{-# INLINE coerceS #-}
-- | Lift 'coerce' to the @t@ parameter of an optic.
coerceT
:: Coercible t t'
=> Optic k is s t a b
-> Optic k is s t' a b
coerceT = \(Optic o) -> Optic (rcoerce . o)
{-# INLINE coerceT #-}
-- | Lift 'coerce' to the @a@ parameter of an optic.
coerceA
:: Coercible a a'
=> Optic k is s t a b
-> Optic k is s t a' b
coerceA = \(Optic o) -> Optic (o . lcoerce)
{-# INLINE coerceA #-}
-- | Lift 'coerce' to the @b@ parameter of an optic.
coerceB
:: Coercible b b'
=> Optic k is s t a b
-> Optic k is s t a b'
coerceB = \(Optic o) -> Optic (o . rcoerce)
{-# INLINE coerceB #-}