{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
#ifdef USE_REFLEX_OPTIMIZER
{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
#endif
module Reflex.BehaviorWriter.Base
( BehaviorWriterT (..)
, runBehaviorWriterT
, withBehaviorWriterT
) where
import Control.Monad.Exception
import Control.Monad.Identity
import Control.Monad.IO.Class
import Control.Monad.Morph
import Control.Monad.Reader
import Control.Monad.Ref
import Control.Monad.State.Strict
import Data.Dependent.Map (DMap)
import qualified Data.Dependent.Map as DMap
import Data.Functor.Misc
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Some (Some)
import Reflex.Class
import Reflex.Adjustable.Class
import Reflex.BehaviorWriter.Class
import Reflex.Host.Class
import Reflex.PerformEvent.Class
import Reflex.PostBuild.Class
import Reflex.Query.Class
import Reflex.Requester.Class
import Reflex.TriggerEvent.Class
newtype BehaviorWriterT t w m a = BehaviorWriterT { BehaviorWriterT t w m a -> StateT [Behavior t w] m a
unBehaviorWriterT :: StateT [Behavior t w] m a }
deriving
( a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
(a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
(forall a b.
(a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b)
-> (forall a b.
a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a)
-> Functor (BehaviorWriterT t w m)
forall a b. a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall a b.
(a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
forall t w (m :: * -> *) a b.
Functor m =>
a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a b.
Functor m =>
(a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
$c<$ :: forall t w (m :: * -> *) a b.
Functor m =>
a -> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
fmap :: (a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
$cfmap :: forall t w (m :: * -> *) a b.
Functor m =>
(a -> b) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
Functor
, Functor (BehaviorWriterT t w m)
a -> BehaviorWriterT t w m a
Functor (BehaviorWriterT t w m)
-> (forall a. a -> BehaviorWriterT t w m a)
-> (forall a b.
BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b)
-> (forall a b c.
(a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c)
-> (forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b)
-> (forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a)
-> Applicative (BehaviorWriterT t w m)
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
(a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c
forall a. a -> BehaviorWriterT t w m a
forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
forall a b.
BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
forall a b c.
(a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c
forall t w (m :: * -> *).
Monad m =>
Functor (BehaviorWriterT t w m)
forall t w (m :: * -> *) a. Monad m => a -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
forall t w (m :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
$c<* :: forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
*> :: BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
$c*> :: forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
liftA2 :: (a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c
$cliftA2 :: forall t w (m :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w m b
-> BehaviorWriterT t w m c
<*> :: BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
$c<*> :: forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m (a -> b)
-> BehaviorWriterT t w m a -> BehaviorWriterT t w m b
pure :: a -> BehaviorWriterT t w m a
$cpure :: forall t w (m :: * -> *) a. Monad m => a -> BehaviorWriterT t w m a
$cp1Applicative :: forall t w (m :: * -> *).
Monad m =>
Functor (BehaviorWriterT t w m)
Applicative
, Applicative (BehaviorWriterT t w m)
a -> BehaviorWriterT t w m a
Applicative (BehaviorWriterT t w m)
-> (forall a b.
BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b)
-> (forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b)
-> (forall a. a -> BehaviorWriterT t w m a)
-> Monad (BehaviorWriterT t w m)
BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
forall a. a -> BehaviorWriterT t w m a
forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
forall a b.
BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b
forall t w (m :: * -> *).
Monad m =>
Applicative (BehaviorWriterT t w m)
forall t w (m :: * -> *) a. Monad m => a -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> BehaviorWriterT t w m a
$creturn :: forall t w (m :: * -> *) a. Monad m => a -> BehaviorWriterT t w m a
>> :: BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
$c>> :: forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m b
>>= :: BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b
$c>>= :: forall t w (m :: * -> *) a b.
Monad m =>
BehaviorWriterT t w m a
-> (a -> BehaviorWriterT t w m b) -> BehaviorWriterT t w m b
$cp1Monad :: forall t w (m :: * -> *).
Monad m =>
Applicative (BehaviorWriterT t w m)
Monad
, m a -> BehaviorWriterT t w m a
(forall (m :: * -> *) a. Monad m => m a -> BehaviorWriterT t w m a)
-> MonadTrans (BehaviorWriterT t w)
forall t w (m :: * -> *) a.
Monad m =>
m a -> BehaviorWriterT t w m a
forall (m :: * -> *) a. Monad m => m a -> BehaviorWriterT t w m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> BehaviorWriterT t w m a
$clift :: forall t w (m :: * -> *) a.
Monad m =>
m a -> BehaviorWriterT t w m a
MonadTrans
, (forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b
(forall (m :: * -> *) (n :: * -> *) b.
Monad m =>
(forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b)
-> MFunctor (BehaviorWriterT t w)
forall t w (m :: * -> *) (n :: * -> *) b.
Monad m =>
(forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b
forall k (t :: (* -> *) -> k -> *).
(forall (m :: * -> *) (n :: * -> *) (b :: k).
Monad m =>
(forall a. m a -> n a) -> t m b -> t n b)
-> MFunctor t
forall (m :: * -> *) (n :: * -> *) b.
Monad m =>
(forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b
hoist :: (forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b
$choist :: forall t w (m :: * -> *) (n :: * -> *) b.
Monad m =>
(forall a. m a -> n a)
-> BehaviorWriterT t w m b -> BehaviorWriterT t w n b
MFunctor
, Monad (BehaviorWriterT t w m)
Monad (BehaviorWriterT t w m)
-> (forall a. IO a -> BehaviorWriterT t w m a)
-> MonadIO (BehaviorWriterT t w m)
IO a -> BehaviorWriterT t w m a
forall a. IO a -> BehaviorWriterT t w m a
forall t w (m :: * -> *).
MonadIO m =>
Monad (BehaviorWriterT t w m)
forall t w (m :: * -> *) a.
MonadIO m =>
IO a -> BehaviorWriterT t w m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> BehaviorWriterT t w m a
$cliftIO :: forall t w (m :: * -> *) a.
MonadIO m =>
IO a -> BehaviorWriterT t w m a
$cp1MonadIO :: forall t w (m :: * -> *).
MonadIO m =>
Monad (BehaviorWriterT t w m)
MonadIO
, Monad (BehaviorWriterT t w m)
Monad (BehaviorWriterT t w m)
-> (forall a.
(a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a)
-> MonadFix (BehaviorWriterT t w m)
(a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
forall a. (a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
forall t w (m :: * -> *).
MonadFix m =>
Monad (BehaviorWriterT t w m)
forall t w (m :: * -> *) a.
MonadFix m =>
(a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
$cmfix :: forall t w (m :: * -> *) a.
MonadFix m =>
(a -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
$cp1MonadFix :: forall t w (m :: * -> *).
MonadFix m =>
Monad (BehaviorWriterT t w m)
MonadFix
, MonadIO (BehaviorWriterT t w m)
MonadException (BehaviorWriterT t w m)
MonadIO (BehaviorWriterT t w m)
-> MonadException (BehaviorWriterT t w m)
-> (forall b.
((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b)
-> MonadAsyncException (BehaviorWriterT t w m)
((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b
forall b.
((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b
forall t w (m :: * -> *).
MonadAsyncException m =>
MonadIO (BehaviorWriterT t w m)
forall t w (m :: * -> *).
MonadAsyncException m =>
MonadException (BehaviorWriterT t w m)
forall t w (m :: * -> *) b.
MonadAsyncException m =>
((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b
forall (m :: * -> *).
MonadIO m
-> MonadException m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> MonadAsyncException m
mask :: ((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b
$cmask :: forall t w (m :: * -> *) b.
MonadAsyncException m =>
((forall a. BehaviorWriterT t w m a -> BehaviorWriterT t w m a)
-> BehaviorWriterT t w m b)
-> BehaviorWriterT t w m b
$cp2MonadAsyncException :: forall t w (m :: * -> *).
MonadAsyncException m =>
MonadException (BehaviorWriterT t w m)
$cp1MonadAsyncException :: forall t w (m :: * -> *).
MonadAsyncException m =>
MonadIO (BehaviorWriterT t w m)
MonadAsyncException
, Monad (BehaviorWriterT t w m)
e -> BehaviorWriterT t w m a
Monad (BehaviorWriterT t w m)
-> (forall e a. Exception e => e -> BehaviorWriterT t w m a)
-> (forall e a.
Exception e =>
BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a)
-> (forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a)
-> MonadException (BehaviorWriterT t w m)
BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall e a. Exception e => e -> BehaviorWriterT t w m a
forall e a.
Exception e =>
BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
forall a b.
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall t w (m :: * -> *).
MonadException m =>
Monad (BehaviorWriterT t w m)
forall t w (m :: * -> *) e a.
(MonadException m, Exception e) =>
e -> BehaviorWriterT t w m a
forall t w (m :: * -> *) e a.
(MonadException m, Exception e) =>
BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a b.
MonadException m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
forall (m :: * -> *).
Monad m
-> (forall e a. Exception e => e -> m a)
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> (forall a b. m a -> m b -> m a)
-> MonadException m
finally :: BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
$cfinally :: forall t w (m :: * -> *) a b.
MonadException m =>
BehaviorWriterT t w m a
-> BehaviorWriterT t w m b -> BehaviorWriterT t w m a
catch :: BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
$ccatch :: forall t w (m :: * -> *) e a.
(MonadException m, Exception e) =>
BehaviorWriterT t w m a
-> (e -> BehaviorWriterT t w m a) -> BehaviorWriterT t w m a
throw :: e -> BehaviorWriterT t w m a
$cthrow :: forall t w (m :: * -> *) e a.
(MonadException m, Exception e) =>
e -> BehaviorWriterT t w m a
$cp1MonadException :: forall t w (m :: * -> *).
MonadException m =>
Monad (BehaviorWriterT t w m)
MonadException
)
runBehaviorWriterT :: (Monad m, Reflex t, Monoid w) => BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT :: BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT (BehaviorWriterT StateT [Behavior t w] m a
a) = do
(a
result, [Behavior t w]
ws) <- StateT [Behavior t w] m a
-> [Behavior t w] -> m (a, [Behavior t w])
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT [Behavior t w] m a
a []
(a, Behavior t w) -> m (a, Behavior t w)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
result, [Behavior t w] -> Behavior t w
forall a. Monoid a => [a] -> a
mconcat ([Behavior t w] -> Behavior t w) -> [Behavior t w] -> Behavior t w
forall a b. (a -> b) -> a -> b
$ [Behavior t w] -> [Behavior t w]
forall a. [a] -> [a]
reverse [Behavior t w]
ws)
withBehaviorWriterT :: (Monoid w, Monoid w', Reflex t, MonadHold t m)
=> (w -> w')
-> BehaviorWriterT t w m a
-> BehaviorWriterT t w' m a
withBehaviorWriterT :: (w -> w') -> BehaviorWriterT t w m a -> BehaviorWriterT t w' m a
withBehaviorWriterT w -> w'
f BehaviorWriterT t w m a
dw = do
(a
r, Behavior t w'
d) <- m (a, Behavior t w') -> BehaviorWriterT t w' m (a, Behavior t w')
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (a, Behavior t w') -> BehaviorWriterT t w' m (a, Behavior t w'))
-> m (a, Behavior t w')
-> BehaviorWriterT t w' m (a, Behavior t w')
forall a b. (a -> b) -> a -> b
$ do
(a
r, Behavior t w
d) <- BehaviorWriterT t w m a -> m (a, Behavior t w)
forall (m :: * -> *) t w a.
(Monad m, Reflex t, Monoid w) =>
BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT BehaviorWriterT t w m a
dw
let d' :: Behavior t w'
d' = (w -> w') -> Behavior t w -> Behavior t w'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap w -> w'
f Behavior t w
d
(a, Behavior t w') -> m (a, Behavior t w')
forall (m :: * -> *) a. Monad m => a -> m a
return (a
r, Behavior t w'
d')
Behavior t w' -> BehaviorWriterT t w' m ()
forall t w (m :: * -> *).
BehaviorWriter t w m =>
Behavior t w -> m ()
tellBehavior Behavior t w'
d
a -> BehaviorWriterT t w' m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
r
deriving instance MonadHold t m => MonadHold t (BehaviorWriterT t w m)
deriving instance MonadSample t m => MonadSample t (BehaviorWriterT t w m)
instance MonadRef m => MonadRef (BehaviorWriterT t w m) where
type Ref (BehaviorWriterT t w m) = Ref m
newRef :: a -> BehaviorWriterT t w m (Ref (BehaviorWriterT t w m) a)
newRef = m (Ref m a) -> BehaviorWriterT t w m (Ref m a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Ref m a) -> BehaviorWriterT t w m (Ref m a))
-> (a -> m (Ref m a)) -> a -> BehaviorWriterT t w m (Ref m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m (Ref m a)
forall (m :: * -> *) a. MonadRef m => a -> m (Ref m a)
newRef
readRef :: Ref (BehaviorWriterT t w m) a -> BehaviorWriterT t w m a
readRef = m a -> BehaviorWriterT t w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> BehaviorWriterT t w m a)
-> (Ref m a -> m a) -> Ref m a -> BehaviorWriterT t w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ref m a -> m a
forall (m :: * -> *) a. MonadRef m => Ref m a -> m a
readRef
writeRef :: Ref (BehaviorWriterT t w m) a -> a -> BehaviorWriterT t w m ()
writeRef Ref (BehaviorWriterT t w m) a
r = m () -> BehaviorWriterT t w m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> BehaviorWriterT t w m ())
-> (a -> m ()) -> a -> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ref m a -> a -> m ()
forall (m :: * -> *) a. MonadRef m => Ref m a -> a -> m ()
writeRef Ref m a
Ref (BehaviorWriterT t w m) a
r
instance MonadAtomicRef m => MonadAtomicRef (BehaviorWriterT t w m) where
atomicModifyRef :: Ref (BehaviorWriterT t w m) a
-> (a -> (a, b)) -> BehaviorWriterT t w m b
atomicModifyRef Ref (BehaviorWriterT t w m) a
r = m b -> BehaviorWriterT t w m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m b -> BehaviorWriterT t w m b)
-> ((a -> (a, b)) -> m b)
-> (a -> (a, b))
-> BehaviorWriterT t w m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ref m a -> (a -> (a, b)) -> m b
forall (m :: * -> *) a b.
MonadAtomicRef m =>
Ref m a -> (a -> (a, b)) -> m b
atomicModifyRef Ref m a
Ref (BehaviorWriterT t w m) a
r
instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (BehaviorWriterT t w m) where
newEventWithTrigger :: (EventTrigger t a -> IO (IO ()))
-> BehaviorWriterT t w m (Event t a)
newEventWithTrigger = m (Event t a) -> BehaviorWriterT t w m (Event t a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Event t a) -> BehaviorWriterT t w m (Event t a))
-> ((EventTrigger t a -> IO (IO ())) -> m (Event t a))
-> (EventTrigger t a -> IO (IO ()))
-> BehaviorWriterT t w m (Event t a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EventTrigger t a -> IO (IO ())) -> m (Event t a)
forall t (m :: * -> *) a.
MonadReflexCreateTrigger t m =>
(EventTrigger t a -> IO (IO ())) -> m (Event t a)
newEventWithTrigger
newFanEventWithTrigger :: (forall a. k a -> EventTrigger t a -> IO (IO ()))
-> BehaviorWriterT t w m (EventSelector t k)
newFanEventWithTrigger forall a. k a -> EventTrigger t a -> IO (IO ())
f = m (EventSelector t k) -> BehaviorWriterT t w m (EventSelector t k)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (EventSelector t k)
-> BehaviorWriterT t w m (EventSelector t k))
-> m (EventSelector t k)
-> BehaviorWriterT t w m (EventSelector t k)
forall a b. (a -> b) -> a -> b
$ (forall a. k a -> EventTrigger t a -> IO (IO ()))
-> m (EventSelector t k)
forall t (m :: * -> *) (k :: * -> *).
(MonadReflexCreateTrigger t m, GCompare k) =>
(forall a. k a -> EventTrigger t a -> IO (IO ()))
-> m (EventSelector t k)
newFanEventWithTrigger forall a. k a -> EventTrigger t a -> IO (IO ())
f
instance (Monad m, Monoid w, Reflex t) => BehaviorWriter t w (BehaviorWriterT t w m) where
tellBehavior :: Behavior t w -> BehaviorWriterT t w m ()
tellBehavior Behavior t w
w = StateT [Behavior t w] m () -> BehaviorWriterT t w m ()
forall t w (m :: * -> *) a.
StateT [Behavior t w] m a -> BehaviorWriterT t w m a
BehaviorWriterT (StateT [Behavior t w] m () -> BehaviorWriterT t w m ())
-> StateT [Behavior t w] m () -> BehaviorWriterT t w m ()
forall a b. (a -> b) -> a -> b
$ ([Behavior t w] -> [Behavior t w]) -> StateT [Behavior t w] m ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Behavior t w
w Behavior t w -> [Behavior t w] -> [Behavior t w]
forall a. a -> [a] -> [a]
:)
instance MonadReader r m => MonadReader r (BehaviorWriterT t w m) where
ask :: BehaviorWriterT t w m r
ask = m r -> BehaviorWriterT t w m r
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m r
forall r (m :: * -> *). MonadReader r m => m r
ask
local :: (r -> r) -> BehaviorWriterT t w m a -> BehaviorWriterT t w m a
local r -> r
f (BehaviorWriterT StateT [Behavior t w] m a
a) = StateT [Behavior t w] m a -> BehaviorWriterT t w m a
forall t w (m :: * -> *) a.
StateT [Behavior t w] m a -> BehaviorWriterT t w m a
BehaviorWriterT (StateT [Behavior t w] m a -> BehaviorWriterT t w m a)
-> StateT [Behavior t w] m a -> BehaviorWriterT t w m a
forall a b. (a -> b) -> a -> b
$ (m (a, [Behavior t w]) -> m (a, [Behavior t w]))
-> StateT [Behavior t w] m a -> StateT [Behavior t w] m a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
mapStateT ((r -> r) -> m (a, [Behavior t w]) -> m (a, [Behavior t w])
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local r -> r
f) StateT [Behavior t w] m a
a
reader :: (r -> a) -> BehaviorWriterT t w m a
reader = m a -> BehaviorWriterT t w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> BehaviorWriterT t w m a)
-> ((r -> a) -> m a) -> (r -> a) -> BehaviorWriterT t w m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (r -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader
instance PerformEvent t m => PerformEvent t (BehaviorWriterT t w m) where
type Performable (BehaviorWriterT t w m) = Performable m
performEvent_ :: Event t (Performable (BehaviorWriterT t w m) ())
-> BehaviorWriterT t w m ()
performEvent_ = m () -> BehaviorWriterT t w m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> BehaviorWriterT t w m ())
-> (Event t (Performable m ()) -> m ())
-> Event t (Performable m ())
-> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event t (Performable m ()) -> m ()
forall t (m :: * -> *).
PerformEvent t m =>
Event t (Performable m ()) -> m ()
performEvent_
performEvent :: Event t (Performable (BehaviorWriterT t w m) a)
-> BehaviorWriterT t w m (Event t a)
performEvent = m (Event t a) -> BehaviorWriterT t w m (Event t a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Event t a) -> BehaviorWriterT t w m (Event t a))
-> (Event t (Performable m a) -> m (Event t a))
-> Event t (Performable m a)
-> BehaviorWriterT t w m (Event t a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event t (Performable m a) -> m (Event t a)
forall t (m :: * -> *) a.
PerformEvent t m =>
Event t (Performable m a) -> m (Event t a)
performEvent
instance TriggerEvent t m => TriggerEvent t (BehaviorWriterT t w m) where
newTriggerEvent :: BehaviorWriterT t w m (Event t a, a -> IO ())
newTriggerEvent = m (Event t a, a -> IO ())
-> BehaviorWriterT t w m (Event t a, a -> IO ())
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Event t a, a -> IO ())
forall t (m :: * -> *) a.
TriggerEvent t m =>
m (Event t a, a -> IO ())
newTriggerEvent
newTriggerEventWithOnComplete :: BehaviorWriterT t w m (Event t a, a -> IO () -> IO ())
newTriggerEventWithOnComplete = m (Event t a, a -> IO () -> IO ())
-> BehaviorWriterT t w m (Event t a, a -> IO () -> IO ())
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Event t a, a -> IO () -> IO ())
forall t (m :: * -> *) a.
TriggerEvent t m =>
m (Event t a, a -> IO () -> IO ())
newTriggerEventWithOnComplete
newEventWithLazyTriggerWithOnComplete :: ((a -> IO () -> IO ()) -> IO (IO ()))
-> BehaviorWriterT t w m (Event t a)
newEventWithLazyTriggerWithOnComplete = m (Event t a) -> BehaviorWriterT t w m (Event t a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Event t a) -> BehaviorWriterT t w m (Event t a))
-> (((a -> IO () -> IO ()) -> IO (IO ())) -> m (Event t a))
-> ((a -> IO () -> IO ()) -> IO (IO ()))
-> BehaviorWriterT t w m (Event t a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> IO () -> IO ()) -> IO (IO ())) -> m (Event t a)
forall t (m :: * -> *) a.
TriggerEvent t m =>
((a -> IO () -> IO ()) -> IO (IO ())) -> m (Event t a)
newEventWithLazyTriggerWithOnComplete
instance PostBuild t m => PostBuild t (BehaviorWriterT t w m) where
getPostBuild :: BehaviorWriterT t w m (Event t ())
getPostBuild = m (Event t ()) -> BehaviorWriterT t w m (Event t ())
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Event t ())
forall t (m :: * -> *). PostBuild t m => m (Event t ())
getPostBuild
instance MonadState s m => MonadState s (BehaviorWriterT t w m) where
get :: BehaviorWriterT t w m s
get = m s -> BehaviorWriterT t w m s
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m s
forall s (m :: * -> *). MonadState s m => m s
get
put :: s -> BehaviorWriterT t w m ()
put = m () -> BehaviorWriterT t w m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> BehaviorWriterT t w m ())
-> (s -> m ()) -> s -> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> m ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put
instance Requester t m => Requester t (BehaviorWriterT t w m) where
type Request (BehaviorWriterT t w m) = Request m
type Response (BehaviorWriterT t w m) = Response m
requesting :: Event t (Request (BehaviorWriterT t w m) a)
-> BehaviorWriterT
t w m (Event t (Response (BehaviorWriterT t w m) a))
requesting = m (Event t (Response m a))
-> BehaviorWriterT t w m (Event t (Response m a))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Event t (Response m a))
-> BehaviorWriterT t w m (Event t (Response m a)))
-> (Event t (Request m a) -> m (Event t (Response m a)))
-> Event t (Request m a)
-> BehaviorWriterT t w m (Event t (Response m a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event t (Request m a) -> m (Event t (Response m a))
forall t (m :: * -> *) a.
Requester t m =>
Event t (Request m a) -> m (Event t (Response m a))
requesting
requesting_ :: Event t (Request (BehaviorWriterT t w m) a)
-> BehaviorWriterT t w m ()
requesting_ = m () -> BehaviorWriterT t w m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> BehaviorWriterT t w m ())
-> (Event t (Request m a) -> m ())
-> Event t (Request m a)
-> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event t (Request m a) -> m ()
forall t (m :: * -> *) a.
Requester t m =>
Event t (Request m a) -> m ()
requesting_
instance (MonadQuery t q m, Monad m) => MonadQuery t q (BehaviorWriterT t w m) where
tellQueryIncremental :: Incremental t (AdditivePatch q) -> BehaviorWriterT t w m ()
tellQueryIncremental = m () -> BehaviorWriterT t w m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> BehaviorWriterT t w m ())
-> (Incremental t (AdditivePatch q) -> m ())
-> Incremental t (AdditivePatch q)
-> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Incremental t (AdditivePatch q) -> m ()
forall t q (m :: * -> *).
MonadQuery t q m =>
Incremental t (AdditivePatch q) -> m ()
tellQueryIncremental
askQueryResult :: BehaviorWriterT t w m (Dynamic t (QueryResult q))
askQueryResult = m (Dynamic t (QueryResult q))
-> BehaviorWriterT t w m (Dynamic t (QueryResult q))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Dynamic t (QueryResult q))
forall t q (m :: * -> *).
MonadQuery t q m =>
m (Dynamic t (QueryResult q))
askQueryResult
queryIncremental :: Incremental t (AdditivePatch q)
-> BehaviorWriterT t w m (Dynamic t (QueryResult q))
queryIncremental = m (Dynamic t (QueryResult q))
-> BehaviorWriterT t w m (Dynamic t (QueryResult q))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Dynamic t (QueryResult q))
-> BehaviorWriterT t w m (Dynamic t (QueryResult q)))
-> (Incremental t (AdditivePatch q)
-> m (Dynamic t (QueryResult q)))
-> Incremental t (AdditivePatch q)
-> BehaviorWriterT t w m (Dynamic t (QueryResult q))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Incremental t (AdditivePatch q) -> m (Dynamic t (QueryResult q))
forall t q (m :: * -> *).
MonadQuery t q m =>
Incremental t (AdditivePatch q) -> m (Dynamic t (QueryResult q))
queryIncremental
instance (Adjustable t m, Monoid w, MonadHold t m, Reflex t) => Adjustable t (BehaviorWriterT t w m) where
runWithReplace :: BehaviorWriterT t w m a
-> Event t (BehaviorWriterT t w m b)
-> BehaviorWriterT t w m (a, Event t b)
runWithReplace BehaviorWriterT t w m a
a0 Event t (BehaviorWriterT t w m b)
a' = do
((a, Behavior t w)
result0, Event t (b, Behavior t w)
result') <- m ((a, Behavior t w), Event t (b, Behavior t w))
-> BehaviorWriterT
t w m ((a, Behavior t w), Event t (b, Behavior t w))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m ((a, Behavior t w), Event t (b, Behavior t w))
-> BehaviorWriterT
t w m ((a, Behavior t w), Event t (b, Behavior t w)))
-> m ((a, Behavior t w), Event t (b, Behavior t w))
-> BehaviorWriterT
t w m ((a, Behavior t w), Event t (b, Behavior t w))
forall a b. (a -> b) -> a -> b
$ m (a, Behavior t w)
-> Event t (m (b, Behavior t w))
-> m ((a, Behavior t w), Event t (b, Behavior t w))
forall t (m :: * -> *) a b.
Adjustable t m =>
m a -> Event t (m b) -> m (a, Event t b)
runWithReplace (BehaviorWriterT t w m a -> m (a, Behavior t w)
forall (m :: * -> *) t w a.
(Monad m, Reflex t, Monoid w) =>
BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT BehaviorWriterT t w m a
a0) (Event t (m (b, Behavior t w))
-> m ((a, Behavior t w), Event t (b, Behavior t w)))
-> Event t (m (b, Behavior t w))
-> m ((a, Behavior t w), Event t (b, Behavior t w))
forall a b. (a -> b) -> a -> b
$ BehaviorWriterT t w m b -> m (b, Behavior t w)
forall (m :: * -> *) t w a.
(Monad m, Reflex t, Monoid w) =>
BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT (BehaviorWriterT t w m b -> m (b, Behavior t w))
-> Event t (BehaviorWriterT t w m b)
-> Event t (m (b, Behavior t w))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event t (BehaviorWriterT t w m b)
a'
Behavior t w -> BehaviorWriterT t w m ()
forall t w (m :: * -> *).
BehaviorWriter t w m =>
Behavior t w -> m ()
tellBehavior (Behavior t w -> BehaviorWriterT t w m ())
-> (Behavior t (Behavior t w) -> Behavior t w)
-> Behavior t (Behavior t w)
-> BehaviorWriterT t w m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior t (Behavior t w) -> Behavior t w
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Behavior t (Behavior t w) -> BehaviorWriterT t w m ())
-> BehaviorWriterT t w m (Behavior t (Behavior t w))
-> BehaviorWriterT t w m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Behavior t w
-> Event t (Behavior t w)
-> BehaviorWriterT t w m (Behavior t (Behavior t w))
forall k (t :: k) (m :: * -> *) a.
MonadHold t m =>
a -> Event t a -> m (Behavior t a)
hold ((a, Behavior t w) -> Behavior t w
forall a b. (a, b) -> b
snd (a, Behavior t w)
result0) ((b, Behavior t w) -> Behavior t w
forall a b. (a, b) -> b
snd ((b, Behavior t w) -> Behavior t w)
-> Event t (b, Behavior t w) -> Event t (Behavior t w)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event t (b, Behavior t w)
result')
(a, Event t b) -> BehaviorWriterT t w m (a, Event t b)
forall (m :: * -> *) a. Monad m => a -> m a
return ((a, Behavior t w) -> a
forall a b. (a, b) -> a
fst (a, Behavior t w)
result0, (b, Behavior t w) -> b
forall a b. (a, b) -> a
fst ((b, Behavior t w) -> b) -> Event t (b, Behavior t w) -> Event t b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event t (b, Behavior t w)
result')
traverseIntMapWithKeyWithAdjust :: (Key -> v -> BehaviorWriterT t w m v')
-> IntMap v
-> Event t (PatchIntMap v)
-> BehaviorWriterT t w m (IntMap v', Event t (PatchIntMap v'))
traverseIntMapWithKeyWithAdjust = ((Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (PatchIntMap v)
-> m (IntMap (v', Behavior t w),
Event t (PatchIntMap (v', Behavior t w))))
-> (Key -> v -> BehaviorWriterT t w m v')
-> IntMap v
-> Event t (PatchIntMap v)
-> BehaviorWriterT t w m (IntMap v', Event t (PatchIntMap v'))
forall t w v' (p :: * -> *) (p' :: * -> *) v (m :: * -> *).
(PatchTarget (p' (Behavior t w)) ~ IntMap (Behavior t w),
Patch (p' (Behavior t w)), Monoid w, Reflex t, MonadHold t m,
Functor p, p ~ p') =>
((Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (p v)
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w))))
-> (Key -> v -> BehaviorWriterT t w m v')
-> IntMap v
-> Event t (p v)
-> BehaviorWriterT t w m (IntMap v', Event t (p v'))
traverseIntMapWithKeyWithAdjustImpl (Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (PatchIntMap v)
-> m (IntMap (v', Behavior t w),
Event t (PatchIntMap (v', Behavior t w)))
forall t (m :: * -> *) v v'.
Adjustable t m =>
(Key -> v -> m v')
-> IntMap v
-> Event t (PatchIntMap v)
-> m (IntMap v', Event t (PatchIntMap v'))
traverseIntMapWithKeyWithAdjust
traverseDMapWithKeyWithAdjustWithMove :: (forall a. k a -> v a -> BehaviorWriterT t w m (v' a))
-> DMap k v
-> Event t (PatchDMapWithMove k v)
-> BehaviorWriterT
t w m (DMap k v', Event t (PatchDMapWithMove k v'))
traverseDMapWithKeyWithAdjustWithMove = ((forall a.
k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (PatchDMapWithMove k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event
t (PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v'))))
-> ((forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v')
-> PatchDMapWithMove k v')
-> ((forall a.
BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v')
-> PatchMapWithMove (Some k) (Behavior t w))
-> (forall a. k a -> v a -> BehaviorWriterT t w m (v' a))
-> DMap k v
-> Event t (PatchDMapWithMove k v)
-> BehaviorWriterT
t w m (DMap k v', Event t (PatchDMapWithMove k v'))
forall t w (k :: * -> *) (v' :: * -> *)
(p :: (* -> *) -> (* -> *) -> *) (p' :: * -> * -> *) (v :: * -> *)
(m :: * -> *).
(PatchTarget (p' (Some k) (Behavior t w))
~ Map (Some k) (Behavior t w),
Patch (p' (Some k) (Behavior t w)), Monoid w, Reflex t,
MonadHold t m) =>
((forall a.
k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (p k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v'))))
-> ((forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> ((forall a.
BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w))
-> (forall a. k a -> v a -> BehaviorWriterT t w m (v' a))
-> DMap k v
-> Event t (p k v)
-> BehaviorWriterT t w m (DMap k v', Event t (p k v'))
traverseDMapWithKeyWithAdjustImpl (forall a. k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (PatchDMapWithMove k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event
t (PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v')))
forall t (m :: * -> *) (k :: * -> *) (v :: * -> *) (v' :: * -> *).
(Adjustable t m, GCompare k) =>
(forall a. k a -> v a -> m (v' a))
-> DMap k v
-> Event t (PatchDMapWithMove k v)
-> m (DMap k v', Event t (PatchDMapWithMove k v'))
traverseDMapWithKeyWithAdjustWithMove (forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v')
-> PatchDMapWithMove k v'
forall k1 (k2 :: k1 -> *) (v :: k1 -> *) (v' :: k1 -> *).
(forall (a :: k1). v a -> v' a)
-> PatchDMapWithMove k2 v -> PatchDMapWithMove k2 v'
mapPatchDMapWithMove (forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> PatchDMapWithMove k (BehaviorWriterTLoweredResult t w v')
-> PatchMapWithMove (Some k) (Behavior t w)
forall k1 (k2 :: k1 -> *) (v :: k1 -> *) v'.
(forall (a :: k1). v a -> v')
-> PatchDMapWithMove k2 v -> PatchMapWithMove (Some k2) v'
weakenPatchDMapWithMoveWith
traverseIntMapWithKeyWithAdjustImpl
:: forall t w v' p p' v m.
( PatchTarget (p' (Behavior t w)) ~ IntMap (Behavior t w)
, Patch (p' (Behavior t w))
, Monoid w
, Reflex t
, MonadHold t m
, Functor p
, p ~ p'
)
=> ( (IntMap.Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (p v)
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
)
-> (IntMap.Key -> v -> BehaviorWriterT t w m v')
-> IntMap v
-> Event t (p v)
-> BehaviorWriterT t w m (IntMap v', Event t (p v'))
traverseIntMapWithKeyWithAdjustImpl :: ((Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (p v)
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w))))
-> (Key -> v -> BehaviorWriterT t w m v')
-> IntMap v
-> Event t (p v)
-> BehaviorWriterT t w m (IntMap v', Event t (p v'))
traverseIntMapWithKeyWithAdjustImpl (Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (p v)
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
base Key -> v -> BehaviorWriterT t w m v'
f (IntMap v
dm0 :: IntMap v) Event t (p v)
dm' = do
(IntMap (v', Behavior t w)
result0, Event t (p (v', Behavior t w))
result') <- m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
-> BehaviorWriterT
t w m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
-> BehaviorWriterT
t w m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w))))
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
-> BehaviorWriterT
t w m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
forall a b. (a -> b) -> a -> b
$ (Key -> v -> m (v', Behavior t w))
-> IntMap v
-> Event t (p v)
-> m (IntMap (v', Behavior t w), Event t (p (v', Behavior t w)))
base (\Key
k v
v -> BehaviorWriterT t w m v' -> m (v', Behavior t w)
forall (m :: * -> *) t w a.
(Monad m, Reflex t, Monoid w) =>
BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT (BehaviorWriterT t w m v' -> m (v', Behavior t w))
-> BehaviorWriterT t w m v' -> m (v', Behavior t w)
forall a b. (a -> b) -> a -> b
$ Key -> v -> BehaviorWriterT t w m v'
f Key
k v
v) IntMap v
dm0 Event t (p v)
dm'
let liftedResult0 :: IntMap v'
liftedResult0 = ((v', Behavior t w) -> v')
-> IntMap (v', Behavior t w) -> IntMap v'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (v', Behavior t w) -> v'
forall a b. (a, b) -> a
fst IntMap (v', Behavior t w)
result0
liftedResult' :: Event t (p v')
liftedResult' = (p (v', Behavior t w) -> p v')
-> Event t (p (v', Behavior t w)) -> Event t (p v')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((v', Behavior t w) -> v') -> p (v', Behavior t w) -> p v'
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (v', Behavior t w) -> v'
forall a b. (a, b) -> a
fst) Event t (p (v', Behavior t w))
result'
liftedWritten0 :: IntMap (Behavior t w)
liftedWritten0 :: IntMap (Behavior t w)
liftedWritten0 = ((v', Behavior t w) -> Behavior t w)
-> IntMap (v', Behavior t w) -> IntMap (Behavior t w)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (v', Behavior t w) -> Behavior t w
forall a b. (a, b) -> b
snd IntMap (v', Behavior t w)
result0
liftedWritten' :: Event t (p (Behavior t w))
liftedWritten' = (p (v', Behavior t w) -> p (Behavior t w))
-> Event t (p (v', Behavior t w)) -> Event t (p (Behavior t w))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((v', Behavior t w) -> Behavior t w)
-> p (v', Behavior t w) -> p (Behavior t w)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (v', Behavior t w) -> Behavior t w
forall a b. (a, b) -> b
snd) Event t (p (v', Behavior t w))
result'
Incremental t (p (Behavior t w))
i <- PatchTarget (p (Behavior t w))
-> Event t (p (Behavior t w))
-> BehaviorWriterT t w m (Incremental t (p (Behavior t w)))
forall k (t :: k) (m :: * -> *) p.
(MonadHold t m, Patch p) =>
PatchTarget p -> Event t p -> m (Incremental t p)
holdIncremental IntMap (Behavior t w)
PatchTarget (p (Behavior t w))
liftedWritten0 Event t (p (Behavior t w))
liftedWritten'
Behavior t w -> BehaviorWriterT t w m ()
forall t w (m :: * -> *).
BehaviorWriter t w m =>
Behavior t w -> m ()
tellBehavior (Behavior t w -> BehaviorWriterT t w m ())
-> Behavior t w -> BehaviorWriterT t w m ()
forall a b. (a -> b) -> a -> b
$ PullM t w -> Behavior t w
forall k (t :: k) a. Reflex t => PullM t a -> Behavior t a
pull (PullM t w -> Behavior t w) -> PullM t w -> Behavior t w
forall a b. (a -> b) -> a -> b
$ do
IntMap (Behavior t w)
m <- Behavior t (IntMap (Behavior t w))
-> PullM t (IntMap (Behavior t w))
forall k (t :: k) (m :: * -> *) a.
MonadSample t m =>
Behavior t a -> m a
sample (Behavior t (IntMap (Behavior t w))
-> PullM t (IntMap (Behavior t w)))
-> Behavior t (IntMap (Behavior t w))
-> PullM t (IntMap (Behavior t w))
forall a b. (a -> b) -> a -> b
$ Incremental t (p (Behavior t w))
-> Behavior t (PatchTarget (p (Behavior t w)))
forall k (t :: k) p.
(Reflex t, Patch p) =>
Incremental t p -> Behavior t (PatchTarget p)
currentIncremental Incremental t (p (Behavior t w))
i
[w] -> w
forall a. Monoid a => [a] -> a
mconcat ([w] -> w) -> (IntMap w -> [w]) -> IntMap w -> w
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntMap w -> [w]
forall a. IntMap a -> [a]
IntMap.elems (IntMap w -> w) -> PullM t (IntMap w) -> PullM t w
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Behavior t w -> PullM t w)
-> IntMap (Behavior t w) -> PullM t (IntMap w)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Behavior t w -> PullM t w
forall k (t :: k) (m :: * -> *) a.
MonadSample t m =>
Behavior t a -> m a
sample IntMap (Behavior t w)
m
(IntMap v', Event t (p v'))
-> BehaviorWriterT t w m (IntMap v', Event t (p v'))
forall (m :: * -> *) a. Monad m => a -> m a
return (IntMap v'
liftedResult0, Event t (p v')
liftedResult')
newtype BehaviorWriterTLoweredResult t w v a = BehaviorWriterTLoweredResult (v a, Behavior t w)
traverseDMapWithKeyWithAdjustImpl
:: forall t w k v' p p' v m.
( PatchTarget (p' (Some k) (Behavior t w)) ~ Map (Some k) (Behavior t w)
, Patch (p' (Some k) (Behavior t w))
, Monoid w
, Reflex t
, MonadHold t m
)
=> ( (forall a. k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (p k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'), Event t (p k (BehaviorWriterTLoweredResult t w v')))
)
-> ((forall a. BehaviorWriterTLoweredResult t w v' a -> v' a) -> p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> ((forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w) -> p k (BehaviorWriterTLoweredResult t w v') -> p' (Some k) (Behavior t w))
-> (forall a. k a -> v a -> BehaviorWriterT t w m (v' a))
-> DMap k v
-> Event t (p k v)
-> BehaviorWriterT t w m (DMap k v', Event t (p k v'))
traverseDMapWithKeyWithAdjustImpl :: ((forall a.
k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (p k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v'))))
-> ((forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> ((forall a.
BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w))
-> (forall a. k a -> v a -> BehaviorWriterT t w m (v' a))
-> DMap k v
-> Event t (p k v)
-> BehaviorWriterT t w m (DMap k v', Event t (p k v'))
traverseDMapWithKeyWithAdjustImpl (forall a. k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (p k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
base (forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> p k (BehaviorWriterTLoweredResult t w v') -> p k v'
mapPatch (forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w)
weakenPatchWith forall a. k a -> v a -> BehaviorWriterT t w m (v' a)
f (DMap k v
dm0 :: DMap k v) Event t (p k v)
dm' = do
(DMap k (BehaviorWriterTLoweredResult t w v')
result0, Event t (p k (BehaviorWriterTLoweredResult t w v'))
result') <- m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
-> BehaviorWriterT
t
w
m
(DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
-> BehaviorWriterT
t
w
m
(DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v'))))
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
-> BehaviorWriterT
t
w
m
(DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
forall a b. (a -> b) -> a -> b
$ (forall a. k a -> v a -> m (BehaviorWriterTLoweredResult t w v' a))
-> DMap k v
-> Event t (p k v)
-> m (DMap k (BehaviorWriterTLoweredResult t w v'),
Event t (p k (BehaviorWriterTLoweredResult t w v')))
base (\k a
k v a
v -> ((v' a, Behavior t w) -> BehaviorWriterTLoweredResult t w v' a)
-> m (v' a, Behavior t w)
-> m (BehaviorWriterTLoweredResult t w v' a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (v' a, Behavior t w) -> BehaviorWriterTLoweredResult t w v' a
forall t w (v :: * -> *) a.
(v a, Behavior t w) -> BehaviorWriterTLoweredResult t w v a
BehaviorWriterTLoweredResult (m (v' a, Behavior t w)
-> m (BehaviorWriterTLoweredResult t w v' a))
-> m (v' a, Behavior t w)
-> m (BehaviorWriterTLoweredResult t w v' a)
forall a b. (a -> b) -> a -> b
$ BehaviorWriterT t w m (v' a) -> m (v' a, Behavior t w)
forall (m :: * -> *) t w a.
(Monad m, Reflex t, Monoid w) =>
BehaviorWriterT t w m a -> m (a, Behavior t w)
runBehaviorWriterT (BehaviorWriterT t w m (v' a) -> m (v' a, Behavior t w))
-> BehaviorWriterT t w m (v' a) -> m (v' a, Behavior t w)
forall a b. (a -> b) -> a -> b
$ k a -> v a -> BehaviorWriterT t w m (v' a)
forall a. k a -> v a -> BehaviorWriterT t w m (v' a)
f k a
k v a
v) DMap k v
dm0 Event t (p k v)
dm'
let getValue :: BehaviorWriterTLoweredResult t w v a -> v a
getValue (BehaviorWriterTLoweredResult (v a
v, Behavior t w
_)) = v a
v
getWritten :: BehaviorWriterTLoweredResult t w v a -> Behavior t w
getWritten (BehaviorWriterTLoweredResult (v a
_, Behavior t w
w)) = Behavior t w
w
liftedResult0 :: DMap k v'
liftedResult0 = (forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> DMap k (BehaviorWriterTLoweredResult t w v') -> DMap k v'
forall k1 (f :: k1 -> *) (g :: k1 -> *) (k2 :: k1 -> *).
(forall (v :: k1). f v -> g v) -> DMap k2 f -> DMap k2 g
DMap.map forall a. BehaviorWriterTLoweredResult t w v' a -> v' a
forall t w (v :: * -> *) a.
BehaviorWriterTLoweredResult t w v a -> v a
getValue DMap k (BehaviorWriterTLoweredResult t w v')
result0
liftedResult' :: Event t (p k v')
liftedResult' = Event t (p k (BehaviorWriterTLoweredResult t w v'))
-> (p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> Event t (p k v')
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t (p k (BehaviorWriterTLoweredResult t w v'))
result' ((p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> Event t (p k v'))
-> (p k (BehaviorWriterTLoweredResult t w v') -> p k v')
-> Event t (p k v')
forall a b. (a -> b) -> a -> b
$ (forall a. BehaviorWriterTLoweredResult t w v' a -> v' a)
-> p k (BehaviorWriterTLoweredResult t w v') -> p k v'
mapPatch forall a. BehaviorWriterTLoweredResult t w v' a -> v' a
forall t w (v :: * -> *) a.
BehaviorWriterTLoweredResult t w v a -> v a
getValue
liftedWritten0 :: Map (Some k) (Behavior t w)
liftedWritten0 :: Map (Some k) (Behavior t w)
liftedWritten0 = (forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> DMap k (BehaviorWriterTLoweredResult t w v')
-> Map (Some k) (Behavior t w)
forall k1 (v :: k1 -> *) v' (k2 :: k1 -> *).
(forall (a :: k1). v a -> v') -> DMap k2 v -> Map (Some k2) v'
weakenDMapWith forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w
forall t w (v :: * -> *) a.
BehaviorWriterTLoweredResult t w v a -> Behavior t w
getWritten DMap k (BehaviorWriterTLoweredResult t w v')
result0
liftedWritten' :: Event t (p' (Some k) (Behavior t w))
liftedWritten' = Event t (p k (BehaviorWriterTLoweredResult t w v'))
-> (p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w))
-> Event t (p' (Some k) (Behavior t w))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
ffor Event t (p k (BehaviorWriterTLoweredResult t w v'))
result' ((p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w))
-> Event t (p' (Some k) (Behavior t w)))
-> (p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w))
-> Event t (p' (Some k) (Behavior t w))
forall a b. (a -> b) -> a -> b
$ (forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w)
-> p k (BehaviorWriterTLoweredResult t w v')
-> p' (Some k) (Behavior t w)
weakenPatchWith forall a. BehaviorWriterTLoweredResult t w v' a -> Behavior t w
forall t w (v :: * -> *) a.
BehaviorWriterTLoweredResult t w v a -> Behavior t w
getWritten
Incremental t (p' (Some k) (Behavior t w))
i <- PatchTarget (p' (Some k) (Behavior t w))
-> Event t (p' (Some k) (Behavior t w))
-> BehaviorWriterT
t w m (Incremental t (p' (Some k) (Behavior t w)))
forall k (t :: k) (m :: * -> *) p.
(MonadHold t m, Patch p) =>
PatchTarget p -> Event t p -> m (Incremental t p)
holdIncremental Map (Some k) (Behavior t w)
PatchTarget (p' (Some k) (Behavior t w))
liftedWritten0 Event t (p' (Some k) (Behavior t w))
liftedWritten'
Behavior t w -> BehaviorWriterT t w m ()
forall t w (m :: * -> *).
BehaviorWriter t w m =>
Behavior t w -> m ()
tellBehavior (Behavior t w -> BehaviorWriterT t w m ())
-> Behavior t w -> BehaviorWriterT t w m ()
forall a b. (a -> b) -> a -> b
$ PullM t w -> Behavior t w
forall k (t :: k) a. Reflex t => PullM t a -> Behavior t a
pull (PullM t w -> Behavior t w) -> PullM t w -> Behavior t w
forall a b. (a -> b) -> a -> b
$ do
Map (Some k) (Behavior t w)
m <- Behavior t (Map (Some k) (Behavior t w))
-> PullM t (Map (Some k) (Behavior t w))
forall k (t :: k) (m :: * -> *) a.
MonadSample t m =>
Behavior t a -> m a
sample (Behavior t (Map (Some k) (Behavior t w))
-> PullM t (Map (Some k) (Behavior t w)))
-> Behavior t (Map (Some k) (Behavior t w))
-> PullM t (Map (Some k) (Behavior t w))
forall a b. (a -> b) -> a -> b
$ Incremental t (p' (Some k) (Behavior t w))
-> Behavior t (PatchTarget (p' (Some k) (Behavior t w)))
forall k (t :: k) p.
(Reflex t, Patch p) =>
Incremental t p -> Behavior t (PatchTarget p)
currentIncremental Incremental t (p' (Some k) (Behavior t w))
i
[w] -> w
forall a. Monoid a => [a] -> a
mconcat ([w] -> w) -> (Map (Some k) w -> [w]) -> Map (Some k) w -> w
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map (Some k) w -> [w]
forall k a. Map k a -> [a]
Map.elems (Map (Some k) w -> w) -> PullM t (Map (Some k) w) -> PullM t w
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Behavior t w -> PullM t w)
-> Map (Some k) (Behavior t w) -> PullM t (Map (Some k) w)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Behavior t w -> PullM t w
forall k (t :: k) (m :: * -> *) a.
MonadSample t m =>
Behavior t a -> m a
sample Map (Some k) (Behavior t w)
m
(DMap k v', Event t (p k v'))
-> BehaviorWriterT t w m (DMap k v', Event t (p k v'))
forall (m :: * -> *) a. Monad m => a -> m a
return (DMap k v'
liftedResult0, Event t (p k v')
liftedResult')