linear-base-0.1.0: Standard library for linear types.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Optics.Linear.Iso

Description

This module provides linear isomorphisms.

An Iso a b s t is equivalent to a (s #-> a, b #-> t). In the simple case of an Iso' a s, this is equivalent to inverse functions (s #-> a, a #-> s). In the general case an Iso a b s t means if you have the isomorphisms (a #-> b, b #-> a) and (s #-> t, t #-> 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)
Synopsis

Types

type Iso s t a b = Optic Profunctor s t a b Source #

type Iso' s a = Iso s s a a Source #

Composing optics

(.>) :: Optic_ arr s t a b -> Optic_ arr a b x y -> Optic_ arr s t x y Source #

Common optics

swap :: SymmetricMonoidal m u => Iso (a `m` b) (c `m` d) (b `m` a) (d `m` c) Source #

assoc :: SymmetricMonoidal m u => Iso (a `m` (b `m` c)) (d `m` (e `m` f)) ((a `m` b) `m` c) ((d `m` e) `m` f) Source #

Using optics

withIso :: Optic_ (Exchange a b) s t a b -> ((s %1 -> a) -> (b %1 -> t) -> r) -> r Source #

Constructing optics

iso :: (s %1 -> a) -> (b %1 -> t) -> Iso s t a b Source #