{-# LANGUAGE CPP #-}
module FRP.BearRiver.Event
(
Event(..)
, noEvent
, noEventFst
, noEventSnd
, event
, fromEvent
, isEvent
, isNoEvent
, tag
, tagWith
, attach
, lMerge
, rMerge
, merge
, mergeBy
, mapMerge
, mergeEvents
, catEvents
, joinE
, splitE
, filterE
, mapFilterE
, gate
, maybeToEvent
)
where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative (Applicative (..), (<$>))
#endif
import Control.Applicative (Alternative (..))
import Control.DeepSeq (NFData (..))
import qualified Control.Monad.Fail as Fail
infixl 8 `tag`, `attach`, `gate`
infixl 7 `joinE`
infixl 6 `lMerge`, `rMerge`, `merge`
data Event a = Event a | NoEvent
deriving (Event a -> Event a -> Bool
forall a. Eq a => Event a -> Event a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Event a -> Event a -> Bool
$c/= :: forall a. Eq a => Event a -> Event a -> Bool
== :: Event a -> Event a -> Bool
$c== :: forall a. Eq a => Event a -> Event a -> Bool
Eq, Event a -> Event a -> Bool
Event a -> Event a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Event a)
forall a. Ord a => Event a -> Event a -> Bool
forall a. Ord a => Event a -> Event a -> Ordering
forall a. Ord a => Event a -> Event a -> Event a
min :: Event a -> Event a -> Event a
$cmin :: forall a. Ord a => Event a -> Event a -> Event a
max :: Event a -> Event a -> Event a
$cmax :: forall a. Ord a => Event a -> Event a -> Event a
>= :: Event a -> Event a -> Bool
$c>= :: forall a. Ord a => Event a -> Event a -> Bool
> :: Event a -> Event a -> Bool
$c> :: forall a. Ord a => Event a -> Event a -> Bool
<= :: Event a -> Event a -> Bool
$c<= :: forall a. Ord a => Event a -> Event a -> Bool
< :: Event a -> Event a -> Bool
$c< :: forall a. Ord a => Event a -> Event a -> Bool
compare :: Event a -> Event a -> Ordering
$ccompare :: forall a. Ord a => Event a -> Event a -> Ordering
Ord, Int -> Event a -> ShowS
forall a. Show a => Int -> Event a -> ShowS
forall a. Show a => [Event a] -> ShowS
forall a. Show a => Event a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Event a] -> ShowS
$cshowList :: forall a. Show a => [Event a] -> ShowS
show :: Event a -> String
$cshow :: forall a. Show a => Event a -> String
showsPrec :: Int -> Event a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Event a -> ShowS
Show)
noEvent :: Event a
noEvent :: forall a. Event a
noEvent = forall a. Event a
NoEvent
noEventFst :: (Event a, b) -> (Event c, b)
noEventFst :: forall a b c. (Event a, b) -> (Event c, b)
noEventFst (Event a
_, b
b) = (forall a. Event a
NoEvent, b
b)
noEventSnd :: (a, Event b) -> (a, Event c)
noEventSnd :: forall a b c. (a, Event b) -> (a, Event c)
noEventSnd (a
a, Event b
_) = (a
a, forall a. Event a
NoEvent)
instance Functor Event where
fmap :: forall a b. (a -> b) -> Event a -> Event b
fmap a -> b
_ Event a
NoEvent = forall a. Event a
NoEvent
fmap a -> b
f (Event a
c) = forall a. a -> Event a
Event (a -> b
f a
c)
instance Applicative Event where
pure :: forall a. a -> Event a
pure = forall a. a -> Event a
Event
Event a -> b
f <*> :: forall a b. Event (a -> b) -> Event a -> Event b
<*> Event a
x = forall a. a -> Event a
Event (a -> b
f a
x)
Event (a -> b)
_ <*> Event a
_ = forall a. Event a
NoEvent
instance Monad Event where
Event a
x >>= :: forall a b. Event a -> (a -> Event b) -> Event b
>>= a -> Event b
f = a -> Event b
f a
x
Event a
NoEvent >>= a -> Event b
_ = forall a. Event a
NoEvent
return :: forall a. a -> Event a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance Fail.MonadFail Event where
fail :: forall a. String -> Event a
fail String
_ = forall a. Event a
NoEvent
instance Alternative Event where
empty :: forall a. Event a
empty = forall a. Event a
NoEvent
Event a
NoEvent <|> :: forall a. Event a -> Event a -> Event a
<|> Event a
r = Event a
r
Event a
l <|> Event a
_ = Event a
l
instance NFData a => NFData (Event a) where
rnf :: Event a -> ()
rnf Event a
NoEvent = ()
rnf (Event a
a) = forall a. NFData a => a -> ()
rnf a
a seq :: forall a b. a -> b -> b
`seq` ()
event :: a -> (b -> a) -> Event b -> a
event :: forall a b. a -> (b -> a) -> Event b -> a
event a
_ b -> a
f (Event b
x) = b -> a
f b
x
event a
x b -> a
_ Event b
NoEvent = a
x
fromEvent :: Event a -> a
fromEvent :: forall a. Event a -> a
fromEvent (Event a
x) = a
x
fromEvent Event a
_ = forall a. HasCallStack => String -> a
error String
"fromEvent NoEvent"
isEvent :: Event a -> Bool
isEvent :: forall a. Event a -> Bool
isEvent (Event a
_) = Bool
True
isEvent Event a
_ = Bool
False
isNoEvent :: Event a -> Bool
isNoEvent :: forall a. Event a -> Bool
isNoEvent = Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Event a -> Bool
isEvent
tag :: Event a -> b -> Event b
Event a
e tag :: forall a b. Event a -> b -> Event b
`tag` b
b = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. a -> b -> a
const b
b) Event a
e
tagWith :: b -> Event a -> Event b
tagWith :: forall a b. a -> Event b -> Event a
tagWith = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. Event a -> b -> Event b
tag
attach :: Event a -> b -> Event (a, b)
Event a
e attach :: forall a b. Event a -> b -> Event (a, b)
`attach` b
b = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
a -> (a
a, b
b)) Event a
e
lMerge :: Event a -> Event a -> Event a
lMerge :: forall a. Event a -> Event a -> Event a
lMerge = forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
rMerge :: Event a -> Event a -> Event a
rMerge :: forall a. Event a -> Event a -> Event a
rMerge = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
merge :: Event a -> Event a -> Event a
merge :: forall a. Event a -> Event a -> Event a
merge = forall a. (a -> a -> a) -> Event a -> Event a -> Event a
mergeBy forall a b. (a -> b) -> a -> b
$ forall a. HasCallStack => String -> a
error String
"Bearriver: merge: Simultaneous event occurrence."
mergeBy :: (a -> a -> a) -> Event a -> Event a -> Event a
mergeBy :: forall a. (a -> a -> a) -> Event a -> Event a -> Event a
mergeBy a -> a -> a
_ Event a
NoEvent Event a
NoEvent = forall a. Event a
NoEvent
mergeBy a -> a -> a
_ le :: Event a
le@(Event a
_) Event a
NoEvent = Event a
le
mergeBy a -> a -> a
_ Event a
NoEvent re :: Event a
re@(Event a
_) = Event a
re
mergeBy a -> a -> a
resolve (Event a
l) (Event a
r) = forall a. a -> Event a
Event (a -> a -> a
resolve a
l a
r)
mapMerge :: (a -> c)
-> (b -> c)
-> (a -> b -> c)
-> Event a
-> Event b
-> Event c
mapMerge :: forall a c b.
(a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
mapMerge a -> c
_ b -> c
_ a -> b -> c
_ Event a
NoEvent Event b
NoEvent = forall a. Event a
NoEvent
mapMerge a -> c
lf b -> c
_ a -> b -> c
_ (Event a
l) Event b
NoEvent = forall a. a -> Event a
Event (a -> c
lf a
l)
mapMerge a -> c
_ b -> c
rf a -> b -> c
_ Event a
NoEvent (Event b
r) = forall a. a -> Event a
Event (b -> c
rf b
r)
mapMerge a -> c
_ b -> c
_ a -> b -> c
lrf (Event a
l) (Event b
r) = forall a. a -> Event a
Event (a -> b -> c
lrf a
l b
r)
mergeEvents :: [Event a] -> Event a
mergeEvents :: forall a. [Event a] -> Event a
mergeEvents = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Event a -> Event a -> Event a
lMerge forall a. Event a
NoEvent
catEvents :: [Event a] -> Event [a]
catEvents :: forall a. [Event a] -> Event [a]
catEvents [Event a]
eas = case [ a
a | Event a
a <- [Event a]
eas ] of
[] -> forall a. Event a
NoEvent
[a]
as -> forall a. a -> Event a
Event [a]
as
joinE :: Event a -> Event b -> Event (a, b)
joinE :: forall a b. Event a -> Event b -> Event (a, b)
joinE Event a
NoEvent Event b
_ = forall a. Event a
NoEvent
joinE Event a
_ Event b
NoEvent = forall a. Event a
NoEvent
joinE (Event a
l) (Event b
r) = forall a. a -> Event a
Event (a
l, b
r)
splitE :: Event (a, b) -> (Event a, Event b)
splitE :: forall a b. Event (a, b) -> (Event a, Event b)
splitE Event (a, b)
NoEvent = (forall a. Event a
NoEvent, forall a. Event a
NoEvent)
splitE (Event (a
a, b
b)) = (forall a. a -> Event a
Event a
a, forall a. a -> Event a
Event b
b)
filterE :: (a -> Bool) -> Event a -> Event a
filterE :: forall a. (a -> Bool) -> Event a -> Event a
filterE a -> Bool
p e :: Event a
e@(Event a
a) = if a -> Bool
p a
a then Event a
e else forall a. Event a
NoEvent
filterE a -> Bool
_ Event a
NoEvent = forall a. Event a
NoEvent
mapFilterE :: (a -> Maybe b) -> Event a -> Event b
mapFilterE :: forall a b. (a -> Maybe b) -> Event a -> Event b
mapFilterE a -> Maybe b
f Event a
e = Event a
e forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall a. Maybe a -> Event a
maybeToEvent forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe b
f)
gate :: Event a -> Bool -> Event a
Event a
_ gate :: forall a. Event a -> Bool -> Event a
`gate` Bool
False = forall a. Event a
NoEvent
Event a
e `gate` Bool
True = Event a
e
maybeToEvent :: Maybe a -> Event a
maybeToEvent :: forall a. Maybe a -> Event a
maybeToEvent Maybe a
Nothing = forall a. Event a
NoEvent
maybeToEvent (Just a
a) = forall a. a -> Event a
Event a
a