linear-base-0.2.0: src/Control/Optics/Linear/Iso.hs
-- | This module provides linear isomorphisms.
--
-- An @Iso a b s t@ is equivalent to a @(s %1-> a, b %1-> t)@. In the simple
-- case of an @Iso' a s@, this is equivalent to inverse functions
-- @(s %1-> a, a %1-> s)@. In the general case an @Iso a b s t@ means if you
-- have the isomorphisms @(a %1-> b, b %1-> a)@ and @(s %1-> t, t %1-> s)@, then
-- you can form isomorphisms between @s@, @t@, @a@ and @b@.
--
-- = Example
--
-- @
-- {-# LANGUAGE LinearTypes #-}
-- {-# LANGUAGE NoImplicitPrelude #-}
-- {-# LANGUAGE GADTs #-}
--
-- import Control.Optics.Linear.Internal
-- import Prelude.Linear
-- import qualified Data.Functor.Linear as Data
--
-- -- A toy example of operating over two isomorphic linear types
-- closureFmap :: (a %1-> b) -> ClosureEither x a %1-> ClosureEither x b
-- closureFmap f = over isoEithers (Data.fmap f)
--
-- data ClosureEither a b where
-- CLeft :: x %1-> (x %1-> a) %1-> ClosureEither a b
-- CRight :: x %1-> (x %1-> b) %1-> ClosureEither a b
--
-- isoEithers ::
-- Iso (ClosureEither a b) (ClosureEither a b') (Either a b) (Either a b')
-- isoEithers = iso fromClosure fromEither
-- where
-- fromEither :: Either a b %1-> ClosureEither a b
-- fromEither (Left a) = CLeft () (\() -> a)
-- fromEither (Right b) = CRight () (\() -> b)
--
-- fromClosure :: ClosureEither a b %1-> Either a b
-- fromClosure (CLeft x f) = Left (f x)
-- fromClosure (CRight x f) = Right (f x)
-- @
module Control.Optics.Linear.Iso
( -- * Types
Iso,
Iso',
-- * Composing optics
(.>),
-- * Common optics
swap,
assoc,
-- * Using optics
withIso,
-- * Constructing optics
iso,
)
where
import Control.Optics.Linear.Internal