content: -- | 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
  