{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
module Circuit.PCA.Optic
( Optic (..),
Lens,
OneShot,
fromClassical,
toClassical,
view,
set,
over,
morphismAsLens,
lensAsMorphism,
)
where
import Circuit.Poly (Mono, Morphism, applyLens, lens)
data Optic mon s u a b where
Optic :: (s -> mon m a) -> (mon m b -> u) -> Optic mon s u a b
type Lens s t a b = Optic (,) s t a b
type OneShot s u a b = Optic (,) s u a b
fromClassical :: (s -> (a, b -> t)) -> Lens s t a b
fromClassical :: forall s a b t. (s -> (a, b -> t)) -> Lens s t a b
fromClassical s -> (a, b -> t)
f =
(s -> (b -> t, a)) -> ((b -> t, b) -> t) -> Optic (,) s t a b
forall {k} {k} s (mon :: k -> k -> *) (m :: k) (a :: k) (b :: k) u.
(s -> mon m a) -> (mon m b -> u) -> Optic mon s u a b
Optic
(\s
s -> let (a
a, b -> t
k) = s -> (a, b -> t)
f s
s in (b -> t
k, a
a))
(\(b -> t
k, b
b) -> b -> t
k b
b)
toClassical :: Lens s t a b -> s -> (a, b -> t)
toClassical :: forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical (Optic s -> (m, a)
get (m, b) -> t
put) s
s =
let (m
m, a
a) = s -> (m, a)
get s
s
in (a
a, \b
b -> (m, b) -> t
put (m
m, b
b))
view :: Lens s s a a -> s -> a
view :: forall s a. Lens s s a a -> s -> a
view Lens s s a a
l s
s = (a, a -> s) -> a
forall a b. (a, b) -> a
fst (Lens s s a a -> s -> (a, a -> s)
forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical Lens s s a a
l s
s)
set :: Lens s t a b -> b -> s -> t
set :: forall s t a b. Lens s t a b -> b -> s -> t
set Lens s t a b
l b
b s
s = (a, b -> t) -> b -> t
forall a b. (a, b) -> b
snd (Lens s t a b -> s -> (a, b -> t)
forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical Lens s t a b
l s
s) b
b
over :: Lens s t a b -> (a -> b) -> s -> t
over :: forall s t a b. Lens s t a b -> (a -> b) -> s -> t
over Lens s t a b
l a -> b
f s
s =
let (a
a, b -> t
k) = Lens s t a b -> s -> (a, b -> t)
forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical Lens s t a b
l s
s
in b -> t
k (a -> b
f a
a)
morphismAsLens :: Morphism (Mono s s) (Mono i o) -> Lens s s o i
morphismAsLens :: forall s i o. Morphism (Mono s s) (Mono i o) -> Lens s s o i
morphismAsLens Morphism (Mono s s) (Mono i o)
m = (s -> (o, i -> s)) -> Lens s s o i
forall s a b t. (s -> (a, b -> t)) -> Lens s t a b
fromClassical ((s -> (o, i -> s)) -> Lens s s o i)
-> (s -> (o, i -> s)) -> Lens s s o i
forall a b. (a -> b) -> a -> b
$ \s
s ->
let (o
o, i -> s
put) = Morphism (Mono s s) (Mono i o) -> s -> (o, i -> s)
forall da a db b.
Morphism (Mono da a) (Mono db b) -> a -> (b, db -> da)
applyLens Morphism (Mono s s) (Mono i o)
m s
s
in (o
o, i -> s
put)
lensAsMorphism :: Lens s s o i -> Morphism (Mono s s) (Mono i o)
lensAsMorphism :: forall s o i. Lens s s o i -> Morphism (Mono s s) (Mono i o)
lensAsMorphism Lens s s o i
l = (s -> o) -> (s -> i -> s) -> Morphism (Mono s s) (Mono i o)
forall a b db da.
(a -> b) -> (a -> db -> da) -> Morphism (Mono da a) (Mono db b)
lens s -> o
get s -> i -> s
put
where
get :: s -> o
get s
s = (o, i -> s) -> o
forall a b. (a, b) -> a
fst (Lens s s o i -> s -> (o, i -> s)
forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical Lens s s o i
l s
s)
put :: s -> i -> s
put s
s i
i = (o, i -> s) -> i -> s
forall a b. (a, b) -> b
snd (Lens s s o i -> s -> (o, i -> s)
forall s t a b. Lens s t a b -> s -> (a, b -> t)
toClassical Lens s s o i
l s
s) i
i