{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
module Circuit.Poles
(
Out (..),
In (..),
Poles (..),
close,
prefixIn,
suffixOut,
poles,
poles0,
polesK,
splay,
splay0,
compose,
compose0,
(>:>),
polesTensor,
iomap,
imap,
omap,
HasDual (..),
copycat,
box,
boxAsymmetric,
pair,
Bias (..),
race,
)
where
import Circuit.Bimonoid (Copy (copy))
import Circuit.Category (Category (..), FunctionLike (..), K (..), (.>))
import Circuit.Channel (Channel (..), Strength (..), Traced (..))
import Circuit.Tensor (Bias (..), Tensor, Unit)
import Circuit.Tensor qualified as Tensor
import Data.Bifunctor (bimap)
import Data.Kind (Type)
import Prelude hiding (id, (.))
newtype Out arr a = Out
{
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit :: forall x. In arr x -> arr x a
}
newtype In arr a = In
{
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit :: forall x. Out arr x -> arr a x
}
data Poles arr a b = Poles
{
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint :: In arr a,
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion :: Out arr b
}
close :: In arr a -> Out arr a -> arr a a
close :: forall {k} (arr :: k -> k -> *) (a :: k).
In arr a -> Out arr a -> arr a a
close In arr a
contra = In arr a -> forall (x :: k). Out arr x -> arr a x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit In arr a
contra
prefixIn :: forall arr a b. (Category arr) => arr a b -> In arr b -> In arr a
prefixIn :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
arr a b -> In arr b -> In arr a
prefixIn arr a b
f In arr b
i = (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). Out arr x -> arr a x) -> In arr a
In ((forall (x :: k). Out arr x -> arr a x) -> In arr a)
-> (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall a b. (a -> b) -> a -> b
$ \(Out arr x
o :: Out arr x) -> arr a b
f arr a b -> arr b x -> arr a x
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> In arr b -> forall (x :: k). Out arr x -> arr b x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit In arr b
i Out arr x
o
suffixOut :: forall arr a b. (Category arr) => Out arr a -> arr a b -> Out arr b
suffixOut :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Out arr a -> arr a b -> Out arr b
suffixOut Out arr a
o arr a b
g = (forall (x :: k). In arr x -> arr x b) -> Out arr b
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). In arr x -> arr x a) -> Out arr a
Out ((forall (x :: k). In arr x -> arr x b) -> Out arr b)
-> (forall (x :: k). In arr x -> arr x b) -> Out arr b
forall a b. (a -> b) -> a -> b
$ \(In arr x
i :: In arr x) -> Out arr a -> forall (x :: k). In arr x -> arr x a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit Out arr a
o In arr x
i arr x a -> arr a b -> arr x 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
g
class (Category arr) => HasDual bot arr where
open :: Poles arr bot bot
copycat :: forall arr bot. (HasDual bot arr) => Poles arr bot bot
copycat :: forall {k} (arr :: k -> k -> *) (bot :: k).
HasDual bot arr =>
Poles arr bot bot
copycat = Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open
{-# INLINE copycat #-}
poles ::
forall arr a b bot.
(HasDual bot arr) =>
arr a bot ->
arr bot b ->
Poles arr a b
poles :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
poles arr a bot
write arr bot b
receive =
In arr a -> Out arr b -> Poles arr a b
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles
(arr a bot -> In arr bot -> In arr a
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
arr a b -> In arr b -> In arr a
prefixIn arr a bot
write (Poles arr bot bot -> In arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open))
(Out arr bot -> arr bot b -> Out arr b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Out arr a -> arr a b -> Out arr b
suffixOut (Poles arr bot bot -> Out arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open) arr bot b
receive)
poles0 ::
(HasDual () arr) =>
arr a () ->
arr () b ->
Poles arr a b
poles0 :: forall (arr :: * -> * -> *) a b.
HasDual () arr =>
arr a () -> arr () b -> Poles arr a b
poles0 = forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
forall (arr :: * -> * -> *) a b bot.
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
poles @_ @_ @_ @()
{-# INLINE poles0 #-}
polesK ::
forall m a b.
(Monad m) =>
(a -> m ()) ->
m b ->
Poles (K m) a b
polesK :: forall (m :: * -> *) a b.
Monad m =>
(a -> m ()) -> m b -> Poles (K m) a b
polesK a -> m ()
write m b
receive = K m a () -> K m () b -> Poles (K m) a b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
poles ((a -> m ()) -> K m a ()
forall {k} (m :: k -> *) a (b :: k). (a -> m b) -> K m a b
K a -> m ()
write) ((() -> m b) -> K m () b
forall {k} (m :: k -> *) a (b :: k). (a -> m b) -> K m a b
K ((() -> m b) -> K m () b) -> (() -> m b) -> K m () b
forall a b. (a -> b) -> a -> b
$ m b -> () -> m b
forall a b. a -> b -> a
const m b
receive)
splay ::
forall arr a b bot.
(HasDual bot arr) =>
Poles arr a b ->
(arr a bot, arr bot b)
splay :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay Poles arr a b
p =
( In arr a -> forall (x :: k). Out arr x -> arr a x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit (Poles arr a b -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint Poles arr a b
p) (Poles arr bot bot -> Out arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion (Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open :: Poles arr bot bot)),
Out arr b -> forall (x :: k). In arr x -> arr x b
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit (Poles arr a b -> Out arr b
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion Poles arr a b
p) (Poles arr bot bot -> In arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint (Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open :: Poles arr bot bot))
)
splay0 ::
(HasDual () arr) =>
Poles arr a b ->
(arr a (), arr () b)
splay0 :: forall (arr :: * -> * -> *) a b.
HasDual () arr =>
Poles arr a b -> (arr a (), arr () b)
splay0 = forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
forall (arr :: * -> * -> *) a b bot.
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay @_ @_ @_ @()
{-# INLINE splay0 #-}
compose ::
forall arr a b c bot.
(HasDual bot arr) =>
Poles arr a b ->
Poles arr b c ->
Poles arr a c
compose :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k)
(bot :: k).
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
compose Poles arr a b
p1 Poles arr b c
p2 =
let (arr a bot
write1, arr bot b
read1) = Poles arr a b -> (arr a bot, arr bot b)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay Poles arr a b
p1 :: (arr a bot, arr bot b)
(arr b bot
write2, arr bot c
read2) = Poles arr b c -> (arr b bot, arr bot c)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay Poles arr b c
p2 :: (arr b bot, arr bot c)
in arr a bot -> arr bot c -> Poles arr a c
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
poles arr a bot
write1 (arr bot b
read1 arr bot b -> arr b bot -> arr bot bot
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr b bot
write2 arr bot bot -> arr bot c -> arr bot c
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> arr bot c
read2)
compose0 ::
(HasDual () arr) =>
Poles arr a b ->
Poles arr b c ->
Poles arr a c
compose0 :: forall (arr :: * -> * -> *) a b c.
HasDual () arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
compose0 = forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k)
(bot :: k).
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
forall (arr :: * -> * -> *) a b c bot.
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
compose @_ @_ @_ @_ @()
{-# INLINE compose0 #-}
(>:>) ::
forall arr a b c bot.
(HasDual bot arr) =>
Poles arr a b ->
Poles arr b c ->
Poles arr a c
Poles arr a b
p1 >:> :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k)
(bot :: k).
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
>:> Poles arr b c
p2 = forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k)
(bot :: k).
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
forall (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> Poles arr b c -> Poles arr a c
compose @arr @a @b @c @bot Poles arr a b
p1 Poles arr b c
p2
infixr 1 >:>
polesTensor ::
forall t arr a b c d bot.
(Tensor t arr, HasDual bot arr, Unit t ~ bot) =>
Poles arr a b ->
Poles arr c d ->
Poles arr (t a c) (t b d)
polesTensor :: forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k) (bot :: k).
(Tensor t arr, HasDual bot arr, Unit t ~ bot) =>
Poles arr a b -> Poles arr c d -> Poles arr (t a c) (t b d)
polesTensor Poles arr a b
p1 Poles arr c d
p2 =
let (arr a bot
write1, arr bot b
read1) = Poles arr a b -> (arr a bot, arr bot b)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay Poles arr a b
p1 :: (arr a bot, arr bot b)
(arr c bot
write2, arr bot d
read2) = Poles arr c d -> (arr c bot, arr bot d)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
Poles arr a b -> (arr a bot, arr bot b)
splay Poles arr c d
p2 :: (arr c bot, arr bot d)
write :: arr (t a c) bot
write = arr (t bot bot) bot
arr (t bot (Unit t)) bot
forall (a :: k). arr (t a (Unit t)) a
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr (t a (Unit t)) a
Tensor.unitr arr (t bot bot) bot -> arr (t a c) (t bot bot) -> arr (t a c) bot
forall (b :: k) (c :: k) (a :: k). arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a bot -> arr c bot -> arr (t a c) (t bot bot)
forall (a :: k) (b :: k) (c :: k) (d :: k).
arr a b -> arr c d -> arr (t a c) (t b d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
Tensor.tensor arr a bot
write1 arr c bot
write2
readPoles :: arr bot (t b d)
readPoles = arr bot b -> arr bot d -> arr (t bot bot) (t b d)
forall (a :: k) (b :: k) (c :: k) (d :: k).
arr a b -> arr c d -> arr (t a c) (t b d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
Tensor.tensor arr bot b
read1 arr bot d
read2 arr (t bot bot) (t b d) -> arr bot (t bot bot) -> arr bot (t b d)
forall (b :: k) (c :: k) (a :: k). arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr bot (t bot bot)
arr bot (t (Unit t) bot)
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)
Tensor.unitl'
in arr (t a c) bot -> arr bot (t b d) -> Poles arr (t a c) (t b d)
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (bot :: k).
HasDual bot arr =>
arr a bot -> arr bot b -> Poles arr a b
poles arr (t a c) bot
write arr bot (t b d)
readPoles
iomap ::
forall arr a a' b b'.
(Category arr) =>
arr a' a ->
arr b b' ->
Poles arr a b ->
Poles arr a' b'
iomap :: 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 a' a
f arr b b'
g (Poles In arr a
i Out arr b
o) = In arr a' -> Out arr b' -> Poles arr a' b'
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles (arr a' a -> In arr a -> In arr a'
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
arr a b -> In arr b -> In arr a
prefixIn arr a' a
f In arr a
i) (Out arr b -> arr b b' -> Out arr b'
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Out arr a -> arr a b -> Out arr b
suffixOut Out arr b
o arr b b'
g)
imap ::
forall arr a a' b.
(Category arr) =>
arr a' a ->
Poles arr a b ->
Poles arr a' b
imap :: forall {k} (arr :: k -> k -> *) (a :: k) (a' :: k) (b :: k).
Category arr =>
arr a' a -> Poles arr a b -> Poles arr a' b
imap arr a' a
f (Poles In arr a
i Out arr b
o) = In arr a' -> Out arr b -> Poles arr a' b
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles (arr a' a -> In arr a -> In arr a'
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
arr a b -> In arr b -> In arr a
prefixIn arr a' a
f In arr a
i) Out arr b
o
omap ::
forall arr a b b'.
(Category arr) =>
arr b b' ->
Poles arr a b ->
Poles arr a b'
omap :: forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (b' :: k).
Category arr =>
arr b b' -> Poles arr a b -> Poles arr a b'
omap arr b b'
g (Poles In arr a
i Out arr b
o) = In arr a -> Out arr b' -> Poles arr a b'
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles In arr a
i (Out arr b -> arr b b' -> Out arr b'
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Category arr =>
Out arr a -> arr a b -> Out arr b
suffixOut Out arr b
o arr b b'
g)
instance HasDual () (->) where
open :: Poles (->) () ()
open = In (->) () -> Out (->) () -> Poles (->) () ()
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles In (->) ()
forall {k} {k} {arr :: k -> k -> *} {a :: k}. In arr a
inU Out (->) ()
outU
where
outU :: Out (->) ()
outU = (forall x. In (->) x -> x -> ()) -> Out (->) ()
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). In arr x -> arr x a) -> Out arr a
Out ((forall x. In (->) x -> x -> ()) -> Out (->) ())
-> (forall x. In (->) x -> x -> ()) -> Out (->) ()
forall a b. (a -> b) -> a -> b
$ \In (->) x
_ -> () -> x -> ()
forall a b. a -> b -> a
const ()
inU :: In arr a
inU = (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). Out arr x -> arr a x) -> In arr a
In ((forall (x :: k). Out arr x -> arr a x) -> In arr a)
-> (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall a b. (a -> b) -> a -> b
$ \Out arr x
o -> Out arr x -> forall (x :: k). In arr x -> arr x x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit Out arr x
o In arr a
inU
instance (Monad m) => HasDual () (K m) where
open :: Poles (K m) () ()
open = In (K m) () -> Out (K m) () -> Poles (K m) () ()
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles In (K m) ()
forall {k} {k} {arr :: k -> k -> *} {a :: k}. In arr a
inU Out (K m) ()
outU
where
outU :: Out (K m) ()
outU = (forall x. In (K m) x -> K m x ()) -> Out (K m) ()
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). In arr x -> arr x a) -> Out arr a
Out ((forall x. In (K m) x -> K m x ()) -> Out (K m) ())
-> (forall x. In (K m) x -> K m x ()) -> Out (K m) ()
forall a b. (a -> b) -> a -> b
$ \In (K m) x
_ -> (x -> m ()) -> K m x ()
forall {k} (m :: k -> *) a (b :: k). (a -> m b) -> K m a b
K ((x -> m ()) -> K m x ()) -> (x -> m ()) -> K m x ()
forall a b. (a -> b) -> a -> b
$ \x
_ -> () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
inU :: In arr a
inU = (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). Out arr x -> arr a x) -> In arr a
In ((forall (x :: k). Out arr x -> arr a x) -> In arr a)
-> (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall a b. (a -> b) -> a -> b
$ \Out arr x
o -> Out arr x -> forall (x :: k). In arr x -> arr x x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit Out arr x
o In arr a
inU
instance HasDual Bool (->) where
open :: Poles (->) Bool Bool
open = In (->) Bool -> Out (->) Bool -> Poles (->) Bool Bool
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles In (->) Bool
forall {k} {k} {arr :: k -> k -> *} {a :: k}. In arr a
inU Out (->) Bool
outU
where
outU :: Out (->) Bool
outU = (forall x. In (->) x -> x -> Bool) -> Out (->) Bool
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). In arr x -> arr x a) -> Out arr a
Out ((forall x. In (->) x -> x -> Bool) -> Out (->) Bool)
-> (forall x. In (->) x -> x -> Bool) -> Out (->) Bool
forall a b. (a -> b) -> a -> b
$ \In (->) x
_ -> Bool -> x -> Bool
forall a b. a -> b -> a
const Bool
False
inU :: In arr a
inU = (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). Out arr x -> arr a x) -> In arr a
In ((forall (x :: k). Out arr x -> arr a x) -> In arr a)
-> (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall a b. (a -> b) -> a -> b
$ \Out arr x
o -> Out arr x -> forall (x :: k). In arr x -> arr x x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit Out arr x
o In arr a
inU
instance (Monad m) => HasDual Bool (K m) where
open :: Poles (K m) Bool Bool
open = In (K m) Bool -> Out (K m) Bool -> Poles (K m) Bool Bool
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
In arr a -> Out arr b -> Poles arr a b
Poles In (K m) Bool
forall {k} {k} {arr :: k -> k -> *} {a :: k}. In arr a
inU Out (K m) Bool
outU
where
outU :: Out (K m) Bool
outU = (forall x. In (K m) x -> K m x Bool) -> Out (K m) Bool
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). In arr x -> arr x a) -> Out arr a
Out ((forall x. In (K m) x -> K m x Bool) -> Out (K m) Bool)
-> (forall x. In (K m) x -> K m x Bool) -> Out (K m) Bool
forall a b. (a -> b) -> a -> b
$ \In (K m) x
_ -> (x -> m Bool) -> K m x Bool
forall {k} (m :: k -> *) a (b :: k). (a -> m b) -> K m a b
K ((x -> m Bool) -> K m x Bool) -> (x -> m Bool) -> K m x Bool
forall a b. (a -> b) -> a -> b
$ \x
_ -> Bool -> m Bool
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
inU :: In arr a
inU = (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k).
(forall (x :: k). Out arr x -> arr a x) -> In arr a
In ((forall (x :: k). Out arr x -> arr a x) -> In arr a)
-> (forall (x :: k). Out arr x -> arr a x) -> In arr a
forall a b. (a -> b) -> a -> b
$ \Out arr x
o -> Out arr x -> forall (x :: k). In arr x -> arr x x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit Out arr x
o In arr a
inU
box ::
forall bot arr a b.
(HasDual bot arr) =>
Poles arr a b ->
arr a b
box :: forall {k} (bot :: k) (arr :: k -> k -> *) (a :: k) (b :: k).
HasDual bot arr =>
Poles arr a b -> arr a b
box Poles arr a b
p =
In arr a -> forall (x :: k). Out arr x -> arr a x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit (Poles arr a b -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint Poles arr a b
p) (Poles arr bot bot -> Out arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion (Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open :: Poles arr bot bot))
arr a bot -> arr bot b -> arr a b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category arr =>
arr a b -> arr b c -> arr a c
.> Out arr b -> forall (x :: k). In arr x -> arr x b
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit (Poles arr a b -> Out arr b
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion Poles arr a b
p) (Poles arr bot bot -> In arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint (Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open :: Poles arr bot bot))
boxAsymmetric ::
forall bot t arr a b.
(HasDual bot arr, Tensor t arr) =>
Poles arr a b ->
arr (t a bot) (t bot b)
boxAsymmetric :: forall {k} (bot :: k) (t :: k -> k -> k) (arr :: k -> k -> *)
(a :: k) (b :: k).
(HasDual bot arr, Tensor t arr) =>
Poles arr a b -> arr (t a bot) (t bot b)
boxAsymmetric Poles arr a b
p =
arr a bot -> arr bot b -> arr (t a bot) (t bot b)
forall (a :: k) (b :: k) (c :: k) (d :: k).
arr a b -> arr c d -> arr (t a c) (t b d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
Tensor.tensor
(In arr a -> forall (x :: k). Out arr x -> arr a x
forall {k} {k} (arr :: k -> k -> *) (a :: k).
In arr a -> forall (x :: k). Out arr x -> arr a x
commit (Poles arr a b -> In arr a
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint Poles arr a b
p) (Poles arr bot bot -> Out arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open))
(Out arr b -> forall (x :: k). In arr x -> arr x b
forall {k} {k} (arr :: k -> k -> *) (a :: k).
Out arr a -> forall (x :: k). In arr x -> arr x a
emit (Poles arr a b -> Out arr b
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> Out arr b
companion Poles arr a b
p) (Poles arr bot bot -> In arr bot
forall {k} {k} (arr :: k -> k -> *) (a :: k) (b :: k).
Poles arr a b -> In arr a
conjoint Poles arr bot bot
forall {k} (bot :: k) (arr :: k -> k -> *).
HasDual bot arr =>
Poles arr bot bot
open))
pair ::
forall arr a b c.
(HasDual () arr, Tensor (,) arr, Copy arr a) =>
Poles arr a b ->
Poles arr a c ->
Poles arr a (b, c)
pair :: forall (arr :: * -> * -> *) a b c.
(HasDual () arr, Tensor (,) arr, Copy arr a) =>
Poles arr a b -> Poles arr a c -> Poles arr a (b, c)
pair Poles arr a b
p1 Poles arr a c
p2 =
let (arr a ()
w1, arr () b
r1) = Poles arr a b -> (arr a (), arr () b)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
Poles arr a b -> (arr a (), arr () b)
splay0 Poles arr a b
p1
(arr a ()
w2, arr () c
r2) = Poles arr a c -> (arr a (), arr () c)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
Poles arr a b -> (arr a (), arr () b)
splay0 Poles arr a c
p2
w :: arr a ()
w = arr ((), ()) ()
arr ((), Unit (,)) ()
forall a. arr (a, Unit (,)) a
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr (t a (Unit t)) a
Tensor.unitr arr ((), ()) () -> arr (a, a) ((), ()) -> arr (a, a) ()
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a () -> arr a () -> arr (a, a) ((), ())
forall a b c d. arr a b -> arr c d -> arr (a, c) (b, d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
Tensor.tensor arr a ()
w1 arr a ()
w2 arr (a, a) () -> arr a (a, a) -> arr a ()
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr a (a, a)
forall (arr :: * -> * -> *) a. Copy arr a => arr a (a, a)
copy
r :: arr () (b, c)
r = arr () b -> arr () c -> arr ((), ()) (b, c)
forall a b c d. arr a b -> arr c d -> arr (a, c) (b, d)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k)
(b :: k) (c :: k) (d :: k).
Tensor t arr =>
arr a b -> arr c d -> arr (t a c) (t b d)
Tensor.tensor arr () b
r1 arr () c
r2 arr ((), ()) (b, c) -> arr () ((), ()) -> arr () (b, c)
forall b c a. arr b c -> arr a b -> arr a c
forall k (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category arr =>
arr b c -> arr a b -> arr a c
. arr () ((), ())
arr () (Unit (,), ())
forall a. arr a (Unit (,), a)
forall {k} (t :: k -> k -> k) (arr :: k -> k -> *) (a :: k).
Unital t arr =>
arr a (t (Unit t) a)
Tensor.unitl'
in arr a () -> arr () (b, c) -> Poles arr a (b, c)
forall (arr :: * -> * -> *) a b.
HasDual () arr =>
arr a () -> arr () b -> Poles arr a b
poles0 arr a ()
w arr () (b, c)
r
race ::
forall arr a b.
(HasDual () arr, Tensor (,) arr, Copy arr a, FunctionLike arr) =>
(b -> Bool) ->
Bias ->
Poles arr a b ->
Poles arr a b ->
Poles arr a b
race :: forall (arr :: * -> * -> *) a b.
(HasDual () arr, Tensor (,) arr, Copy arr a, FunctionLike arr) =>
(b -> Bool)
-> Bias -> Poles arr a b -> Poles arr a b -> Poles arr a b
race b -> Bool
isSilent Bias
bias Poles arr a b
p1 Poles arr a b
p2 = arr (b, b) b -> Poles arr a (b, b) -> Poles arr a b
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k) (b' :: k).
Category arr =>
arr b b' -> Poles arr a b -> Poles arr a b'
omap (((b, b) -> b) -> arr (b, b) b
forall a b. (a -> b) -> arr a b
forall (arr :: * -> * -> *) a b.
FunctionLike arr =>
(a -> b) -> arr a b
function (Bias -> (b, b) -> b
pick Bias
bias)) (Poles arr a b -> Poles arr a b -> Poles arr a (b, b)
forall (arr :: * -> * -> *) a b c.
(HasDual () arr, Tensor (,) arr, Copy arr a) =>
Poles arr a b -> Poles arr a c -> Poles arr a (b, c)
pair Poles arr a b
p1 Poles arr a b
p2)
where
pick :: Bias -> (b, b) -> b
pick Bias
LeftFirst (b
x, b
y) = if b -> Bool
isSilent b
x then b
y else b
x
pick Bias
RightFirst (b
x, b
y) = if b -> Bool
isSilent b
y then b
x else b
y