-
Notifications
You must be signed in to change notification settings - Fork 0
/
Extra.purs
138 lines (109 loc) · 3.7 KB
/
Extra.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
module IxSignal.Extra where
import IxSignal.Internal (IxSignal)
import IxSignal.Internal as IxSignal
import Prelude
import Data.Maybe (Maybe (..))
import Data.Either (Either (..))
import Data.UUID (GENUUID, genUUID)
import Control.Monad.Aff (Aff, makeAff, nonCanceler)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Class (liftEff)
import Control.Monad.Eff.Ref (REF)
-- * Proceeding when satisfying a Predicate
-- | Applies the function only once, when the predicate is satisfied (potentially immediately)
onWhenIx :: forall eff a b
. (b -> Maybe a)
-> (a -> Eff (ref :: REF | eff) Unit)
-> String
-> IxSignal (ref :: REF | eff) b
-> Eff (ref :: REF | eff) Unit
onWhenIx g f k sig =
-- uses subscribeIx to aggressively attempt application
IxSignal.subscribeIx go k sig
where
go b = case g b of
Nothing -> pure unit
Just x -> do
IxSignal.deleteSubscriber k sig
f x
onWhen :: forall eff a b
. (b -> Maybe a)
-> (a -> Eff (ref :: REF, uuid :: GENUUID | eff) Unit)
-> IxSignal (ref :: REF, uuid :: GENUUID | eff) b
-> Eff (ref :: REF, uuid :: GENUUID | eff) Unit
onWhen g f sig = do
k <- show <$> genUUID
onWhenIx g f k sig
-- | Applies the handler once
onAvailableIx :: forall eff a
. (a -> Eff (ref :: REF | eff) Unit)
-> String
-> IxSignal (ref :: REF | eff) (Maybe a)
-> Eff (ref :: REF | eff) Unit
onAvailableIx = onWhenIx id
onAvailable :: forall eff a
. (a -> Eff (ref :: REF, uuid :: GENUUID | eff) Unit)
-> IxSignal (ref :: REF, uuid :: GENUUID | eff) (Maybe a)
-> Eff (ref :: REF, uuid :: GENUUID | eff) Unit
onAvailable = onWhen id
getWhenIx :: forall eff a b
. (b -> Maybe a)
-> String
-> IxSignal (ref :: REF | eff) b
-> Aff (ref :: REF | eff) a
getWhenIx g k sig =
makeAff \resolve -> do
onWhenIx g (resolve <<< Right) k sig
pure nonCanceler
getWhen :: forall eff a b
. (b -> Maybe a)
-> IxSignal (ref :: REF, uuid :: GENUUID | eff) b
-> Aff (ref :: REF, uuid :: GENUUID | eff) a
getWhen g sig = do
k <- show <$> liftEff genUUID
getWhenIx g k sig
getAvailableIx :: forall eff a
. String
-> IxSignal (ref :: REF | eff) (Maybe a)
-> Aff (ref :: REF | eff) a
getAvailableIx = getWhenIx id
getAvailable :: forall eff a
. IxSignal (ref :: REF, uuid :: GENUUID | eff) (Maybe a)
-> Aff (ref :: REF, uuid :: GENUUID | eff) a
getAvailable sig = do
k <- show <$> liftEff genUUID
getAvailableIx k sig
-- * Proceeding on the next change
-- | Applies the function only once, on the next change
onNextIx :: forall eff a
. (a -> Eff (ref :: REF | eff) Unit)
-> String
-> IxSignal (ref :: REF | eff) a
-> Eff (ref :: REF | eff) Unit
onNextIx f k sig =
IxSignal.subscribeIxLight go k sig
where
go x = do
IxSignal.deleteSubscriber k sig
f x
onNext :: forall eff a
. (a -> Eff (ref :: REF, uuid :: GENUUID | eff) Unit)
-> IxSignal (ref :: REF, uuid :: GENUUID | eff) a
-> Eff (ref :: REF, uuid :: GENUUID | eff) Unit
onNext f sig = do
k <- show <$> genUUID
onNextIx f k sig
getNextIx :: forall eff a
. String
-> IxSignal (ref :: REF | eff) a
-> Aff (ref :: REF | eff) a
getNextIx k sig =
makeAff \resolve -> do
onNextIx (resolve <<< Right) k sig
pure nonCanceler
getNext :: forall eff a
. IxSignal (ref :: REF, uuid :: GENUUID | eff) a
-> Aff (ref :: REF, uuid :: GENUUID | eff) a
getNext sig = do
k <- show <$> liftEff genUUID
getNextIx k sig