module Circuit.Optic
(
Optic (..),
SomeOptic (..),
withSomeOptic,
identityOptic,
composeOptic,
identitySomeOptic,
composeSomeOptic,
opticUpdate,
someOpticUpdate,
opticPoles,
opticAsLens,
lensAsOptic,
)
where
import Circuit.Category (Category, (.>))
import Circuit.Channel (Channel (..), Strength (..))
import Circuit.Poles (Poles, iomap)
import Circuit.Poly (Mono, Morphism, applyLens, lens)
import Circuit.Tensor (Unit, Unital (..))
import Prelude hiding (id, (.))
data Optic t arr ch a b s r = Optic
{
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
Optic t arr ch a b s r -> arr s (t ch a)
opticForward :: arr s (t ch a),
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
Optic t arr ch a b s r -> arr (t ch b) r
opticBackward :: arr (t ch b) r
}
data SomeOptic t arr a b s r where
SomeOptic :: Optic t arr ch a b s r -> SomeOptic t arr a b s r
withSomeOptic ::
SomeOptic t arr a b s r ->
(forall ch. Optic t arr ch a b s r -> x) ->
x
withSomeOptic :: forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (s :: k) (r :: k) x.
SomeOptic t arr a b s r
-> (forall (ch :: k). Optic t arr ch a b s r -> x) -> x
withSomeOptic (SomeOptic Optic t arr ch a b s r
o) forall (ch :: k). Optic t arr ch a b s r -> x
k = Optic t arr ch a b s r -> x
forall (ch :: k). Optic t arr ch a b s r -> x
k Optic t arr ch a b s r
o
identityOptic :: (Unital t arr) => Optic t arr (Unit t) a b a b
identityOptic :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Unital t arr =>
Optic t arr (Unit t) a b a b
identityOptic = arr a (t (Unit t) a)
-> arr (t (Unit t) b) b -> Optic t arr (Unit t) a b a b
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
arr s (t ch a) -> arr (t ch b) r -> Optic t arr ch a b s r
Optic arr a (t (Unit t) a)
forall (a :: k). arr a (t (Unit t) a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr a (t (Unit t) a)
unitl' arr (t (Unit t) b) b
forall (a :: k). arr (t (Unit t) a) a
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr (t (Unit t) a) a
unitl
{-# INLINE identityOptic #-}
composeOptic ::
(Strength t arr) =>
Optic t arr ch2 u v a b ->
Optic t arr ch1 a b s r ->
Optic t arr (t ch1 ch2) u v s r
composeOptic :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (ch2 :: k)
(u :: k) (v :: k) (a :: k) (b :: k) (ch1 :: k) (s :: k) (r :: k).
Strength t arr =>
Optic t arr ch2 u v a b
-> Optic t arr ch1 a b s r -> Optic t arr (t ch1 ch2) u v s r
composeOptic (Optic arr a (t ch2 u)
f2 arr (t ch2 v) b
b2) (Optic arr s (t ch1 a)
f1 arr (t ch1 b) r
b1) =
arr s (t (t ch1 ch2) u)
-> arr (t (t ch1 ch2) v) r -> Optic t arr (t ch1 ch2) u v s r
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
arr s (t ch a) -> arr (t ch b) r -> Optic t arr ch a b s r
Optic
(arr s (t ch1 a)
f1 arr s (t ch1 a)
-> arr (t ch1 a) (t ch1 (t ch2 u)) -> arr s (t ch1 (t ch2 u))
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr a (t ch2 u) -> arr (t ch1 a) (t ch1 (t ch2 u))
forall (b :: k) (c :: k) (a :: k). arr b c -> arr (t a b) (t a c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (b :: k)
(c :: k) (a :: k).
Strength t arr =>
arr b c -> arr (t a b) (t a c)
strength arr a (t ch2 u)
f2 arr s (t ch1 (t ch2 u))
-> arr (t ch1 (t ch2 u)) (t (t ch1 ch2) u)
-> arr s (t (t ch1 ch2) u)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr (t ch1 (t ch2 u)) (t (t ch1 ch2) u)
forall (a :: k) (b :: k) (c :: k). arr (t a (t b c)) (t (t a b) c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t a (t b c)) (t (t a b) c)
assoc')
(arr (t (t ch1 ch2) v) (t ch1 (t ch2 v))
forall (a :: k) (b :: k) (c :: k). arr (t (t a b) c) (t a (t b c))
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k).
Channel t arr =>
arr (t (t a b) c) (t a (t b c))
assoc arr (t (t ch1 ch2) v) (t ch1 (t ch2 v))
-> arr (t ch1 (t ch2 v)) (t ch1 b)
-> arr (t (t ch1 ch2) v) (t ch1 b)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr (t ch2 v) b -> arr (t ch1 (t ch2 v)) (t ch1 b)
forall (b :: k) (c :: k) (a :: k). arr b c -> arr (t a b) (t a c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (b :: k)
(c :: k) (a :: k).
Strength t arr =>
arr b c -> arr (t a b) (t a c)
strength arr (t ch2 v) b
b2 arr (t (t ch1 ch2) v) (t ch1 b)
-> arr (t ch1 b) r -> arr (t (t ch1 ch2) v) r
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr (t ch1 b) r
b1)
{-# INLINE composeOptic #-}
identitySomeOptic :: (Unital t arr) => SomeOptic t arr a b a b
identitySomeOptic :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Unital t arr =>
SomeOptic t arr a b a b
identitySomeOptic = Optic t arr (Unit t) a b a b -> SomeOptic t arr a b a b
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
Optic t arr ch a b s r -> SomeOptic t arr a b s r
SomeOptic Optic t arr (Unit t) a b a b
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k).
Unital t arr =>
Optic t arr (Unit t) a b a b
identityOptic
{-# INLINE identitySomeOptic #-}
composeSomeOptic ::
(Strength t arr) =>
SomeOptic t arr u v a b ->
SomeOptic t arr a b s r ->
SomeOptic t arr u v s r
composeSomeOptic :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (u :: k)
(v :: k) (a :: k) (b :: k) (s :: k) (r :: k).
Strength t arr =>
SomeOptic t arr u v a b
-> SomeOptic t arr a b s r -> SomeOptic t arr u v s r
composeSomeOptic (SomeOptic Optic t arr ch u v a b
o2) (SomeOptic Optic t arr ch a b s r
o1) = Optic t arr (t ch ch) u v s r -> SomeOptic t arr u v s r
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
Optic t arr ch a b s r -> SomeOptic t arr a b s r
SomeOptic (Optic t arr ch u v a b
-> Optic t arr ch a b s r -> Optic t arr (t ch ch) u v s r
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (ch2 :: k)
(u :: k) (v :: k) (a :: k) (b :: k) (ch1 :: k) (s :: k) (r :: k).
Strength t arr =>
Optic t arr ch2 u v a b
-> Optic t arr ch1 a b s r -> Optic t arr (t ch1 ch2) u v s r
composeOptic Optic t arr ch u v a b
o2 Optic t arr ch a b s r
o1)
{-# INLINE composeSomeOptic #-}
opticUpdate ::
(Strength t arr) =>
Optic t arr ch a b s r ->
arr a b ->
arr s r
opticUpdate :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (ch :: k)
(a :: k) (b :: k) (s :: k) (r :: k).
Strength t arr =>
Optic t arr ch a b s r -> arr a b -> arr s r
opticUpdate (Optic arr s (t ch a)
f arr (t ch b) r
b) arr a b
m = arr s (t ch a)
f arr s (t ch a) -> arr (t ch a) (t ch b) -> arr s (t ch b)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr a b -> arr (t ch a) (t ch b)
forall (b :: k) (c :: k) (a :: k). arr b c -> arr (t a b) (t a c)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (b :: k)
(c :: k) (a :: k).
Strength t arr =>
arr b c -> arr (t a b) (t a c)
strength arr a b
m arr s (t ch b) -> arr (t ch b) r -> arr s r
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr (t ch b) r
b
{-# INLINE opticUpdate #-}
someOpticUpdate ::
(Strength t arr) =>
SomeOptic t arr a b s r ->
arr a b ->
arr s r
someOpticUpdate :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (s :: k) (r :: k).
Strength t arr =>
SomeOptic t arr a b s r -> arr a b -> arr s r
someOpticUpdate (SomeOptic Optic t arr ch a b s r
o) = Optic t arr ch a b s r -> arr a b -> arr s r
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (ch :: k)
(a :: k) (b :: k) (s :: k) (r :: k).
Strength t arr =>
Optic t arr ch a b s r -> arr a b -> arr s r
opticUpdate Optic t arr ch a b s r
o
{-# INLINE someOpticUpdate #-}
opticPoles ::
(Category arr) =>
Optic t arr ch a b s r ->
Poles arr (t ch a) (t ch b) ->
Poles arr s r
opticPoles :: forall {k1} {k} {k} (arr :: k1 -> k1 -> *) (t :: k -> k -> k1)
(ch :: k) (a :: k) (b :: k) (s :: k1) (r :: k1).
Category arr =>
Optic t arr ch a b s r
-> Poles arr (t ch a) (t ch b) -> Poles arr s r
opticPoles (Optic arr s (t ch a)
f arr (t ch b) r
b) = arr s (t ch a)
-> arr (t ch b) r -> Poles arr (t ch a) (t ch b) -> Poles arr s r
forall {k} (arr :: k -> k -> *) (a :: k) (a' :: k) (b :: k)
(b' :: k).
Category arr =>
arr a' a -> arr b b' -> Poles arr a b -> Poles arr a' b'
iomap arr s (t ch a)
f arr (t ch b) r
b
{-# INLINE opticPoles #-}
opticAsLens :: SomeOptic (,) (->) a b s r -> Morphism (Mono r s) (Mono b a)
opticAsLens :: forall a b s r.
SomeOptic (,) (->) a b s r -> Morphism (Mono r s) (Mono b a)
opticAsLens (SomeOptic (Optic s -> (ch, a)
f (ch, b) -> r
g)) =
(s -> a) -> (s -> b -> r) -> Morphism (Mono r s) (Mono b a)
forall a b db da.
(a -> b) -> (a -> db -> da) -> Morphism (Mono da a) (Mono db b)
lens (\s
s -> (ch, a) -> a
forall a b. (a, b) -> b
snd (s -> (ch, a)
f s
s)) (\s
s b
b -> (ch, b) -> r
g ((ch, a) -> ch
forall a b. (a, b) -> a
fst (s -> (ch, a)
f s
s), b
b))
lensAsOptic :: Morphism (Mono r s) (Mono b a) -> Optic (,) (->) (b -> r) a b s r
lensAsOptic :: forall r s b a.
Morphism (Mono r s) (Mono b a) -> Optic (,) (->) (b -> r) a b s r
lensAsOptic Morphism (Mono r s) (Mono b a)
m =
(s -> (b -> r, a))
-> ((b -> r, b) -> r) -> Optic (,) (->) (b -> r) a b s r
forall {k} {k} {k} (t :: k -> k -> k) (arr :: k -> k -> *)
(ch :: k) (a :: k) (b :: k) (s :: k) (r :: k).
arr s (t ch a) -> arr (t ch b) r -> Optic t arr ch a b s r
Optic
(\s
s -> let (a
a, b -> r
k) = Morphism (Mono r s) (Mono b a) -> s -> (a, b -> r)
forall da a db b.
Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
applyLens Morphism (Mono r s) (Mono b a)
m s
s in (b -> r
k, a
a))
(\(b -> r
k, b
b) -> b -> r
k b
b)