Skip to content

Commit d7bc23b

Browse files
authored
Merge pull request #3 from natefaubion/arg-order
Argument order, status
2 parents ea03737 + 882221d commit d7bc23b

File tree

3 files changed

+134
-66
lines changed

3 files changed

+134
-66
lines changed

src/Control/Monad/Eff/AVar.js

+30-24
Original file line numberDiff line numberDiff line change
@@ -133,88 +133,94 @@ exports.makeVar = function (value) {
133133
};
134134
};
135135

136-
exports._killVar = function (left, right, avar, error) {
136+
exports._killVar = function (util, error, avar) {
137137
return function () {
138138
if (avar.error === null) {
139139
avar.error = error;
140140
avar.value = EMPTY;
141-
drainVar(left, right, avar);
141+
drainVar(util, avar);
142142
}
143143
};
144144
};
145145

146-
exports._putVar = function (left, right, avar, value, cb) {
146+
exports._putVar = function (util, value, avar, cb) {
147147
return function () {
148148
var cell = putLast(avar.puts, { cb: cb, value: value });
149-
drainVar(left, right, avar);
149+
drainVar(util, avar);
150150
return function () {
151151
deleteCell(cell);
152152
};
153153
};
154154
};
155155

156-
exports._takeVar = function (left, right, avar, cb) {
156+
exports._takeVar = function (util, avar, cb) {
157157
return function () {
158158
var cell = putLast(avar.takes, cb);
159-
drainVar(left, right, avar);
159+
drainVar(util, avar);
160160
return function () {
161161
deleteCell(cell);
162162
};
163163
};
164164
};
165165

166-
exports._readVar = function (left, right, avar, cb) {
166+
exports._readVar = function (util, avar, cb) {
167167
return function () {
168168
var cell = putLast(avar.reads, cb);
169-
drainVar(left, right, avar);
169+
drainVar(util, avar);
170170
return function () {
171171
deleteCell(cell);
172172
};
173173
};
174174
};
175175

176-
exports._tryPutVar = function (left, right, avar, value) {
176+
exports._tryPutVar = function (util, value, avar) {
177177
return function () {
178178
if (avar.value === EMPTY && avar.error === null) {
179179
avar.value = value;
180-
drainVar(left, right, avar);
180+
drainVar(util, avar);
181181
return true;
182182
} else {
183183
return false;
184184
}
185185
};
186186
};
187187

188-
exports._tryTakeVar = function (left, right, nothing, just, avar) {
188+
exports._tryTakeVar = function (util, avar) {
189189
return function () {
190190
var value = avar.value;
191191
if (value === EMPTY) {
192-
return nothing;
192+
return util.nothing;
193193
} else {
194194
avar.value = EMPTY;
195-
drainVar(left, right, avar);
196-
return just(value);
195+
drainVar(util, avar);
196+
return util.just(value);
197197
}
198198
};
199199
};
200200

201-
exports._tryReadVar = function (nothing, just, avar) {
201+
exports._tryReadVar = function (util, avar) {
202202
return function () {
203203
if (avar.value === EMPTY) {
204-
return nothing;
204+
return util.nothing;
205205
} else {
206-
return just(avar.value);
206+
return util.just(avar.value);
207207
}
208208
};
209209
};
210210

211-
exports.isEmptyVar = function (avar) {
211+
exports._status = function (util, avar) {
212212
return function () {
213-
return avar.value === EMPTY;
213+
if (avar.error) {
214+
return util.killed(avar.error);
215+
}
216+
if (avar.value === EMPTY) {
217+
return util.empty;
218+
}
219+
return util.filled(avar.value);
214220
};
215221
};
216222

217-
function drainVar (left, right, avar) {
223+
function drainVar (util, avar) {
218224
if (avar.draining) {
219225
return;
220226
}
@@ -235,7 +241,7 @@ function drainVar (left, right, avar) {
235241
rsize = rs.size;
236242

237243
if (avar.error !== null) {
238-
value = left(avar.error);
244+
value = util.left(avar.error);
239245
while (p = takeHead(ps)) {
240246
runEff(p.cb(value));
241247
}
@@ -262,16 +268,16 @@ function drainVar (left, right, avar) {
262268
// We only want to process the reads queued up before running these
263269
// callbacks so we guard on rsize.
264270
while (rsize-- && (r = takeHead(rs))) {
265-
runEff(r(right(value)));
271+
runEff(r(util.right(value)));
266272
}
267273
if (t !== null) {
268274
avar.value = EMPTY;
269-
runEff(t(right(value)));
275+
runEff(t(util.right(value)));
270276
}
271277
}
272278

273279
if (p !== null) {
274-
runEff(p.cb(right(void 0)));
280+
runEff(p.cb(util.right(void 0)));
275281
}
276282

277283
// Callbacks could have queued up more items so we need to guard on the

src/Control/Monad/Eff/AVar.purs

+84-22
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@ module Control.Monad.Eff.AVar
33
, AVAR
44
, AVarEff
55
, AVarCallback
6+
, AVarStatus(..)
67
, makeVar
78
, makeEmptyVar
8-
, isEmptyVar
99
, takeVar
1010
, tryTakeVar
1111
, putVar
1212
, tryPutVar
1313
, readVar
1414
, tryReadVar
1515
, killVar
16+
, status
17+
, isEmptyVar
18+
, isFilledVar
19+
, isKilledVar
20+
, isEmpty
21+
, isFilled
22+
, isKilled
1623
) where
1724

1825
import Prelude
@@ -30,59 +37,114 @@ foreign import data AVar ∷ Type → Type
3037

3138
foreign import data AVAREffect
3239

40+
data AVarStatus a
41+
= Killed Error
42+
| Filled a
43+
| Empty
44+
3345
-- | Creates a fresh AVar.
3446
foreign import makeEmptyVar eff a. AVarEff eff (AVar a)
3547

3648
-- | Creates a fresh AVar with an initial value.
3749
foreign import makeVar eff a. a AVarEff eff (AVar a)
3850

39-
-- | Synchronously checks whether an AVar currently has a value.
40-
foreign import isEmptyVar eff a. AVar a AVarEff eff Boolean
41-
4251
-- | Kills the AVar with an exception. All pending and future actions will
4352
-- | resolve immediately with the provided exception.
44-
killVar eff a. AVar a Error AVarEff eff Unit
45-
killVar avar err = Fn.runFn4 _killVar Left Right avar err
53+
killVar eff a. Error AVar a AVarEff eff Unit
54+
killVar err avar = Fn.runFn3 _killVar ffiUtil err avar
4655

4756
-- | Sets the value of the AVar. If the AVar is already filled, it will be
4857
-- | queued until the value is emptied. Multiple puts will resolve in order as
4958
-- | the AVar becomes available. Returns an effect which will remove the
5059
-- | callback from the pending queue.
51-
putVar eff a. AVar a a AVarCallback eff Unit AVarEff eff (AVarEff eff Unit)
52-
putVar avar value cb = Fn.runFn5 _putVar Left Right avar value cb
60+
putVar eff a. a AVar a AVarCallback eff Unit AVarEff eff (AVarEff eff Unit)
61+
putVar value avar cb = Fn.runFn4 _putVar ffiUtil value avar cb
5362

5463
-- | Attempts to synchronously fill an AVar. If the AVar is already filled,
5564
-- | this will do nothing. Returns true or false depending on if it succeeded.
56-
tryPutVar eff a. AVar a a AVarEff eff Boolean
57-
tryPutVar avar value = Fn.runFn4 _tryPutVar Left Right avar value
65+
tryPutVar eff a. a AVar a AVarEff eff Boolean
66+
tryPutVar value avar = Fn.runFn3 _tryPutVar ffiUtil value avar
5867

5968
-- | Takes the AVar value, leaving it empty. If the AVar is already empty,
6069
-- | the callback will be queued until the AVar is filled. Multiple takes will
6170
-- | resolve in order as the AVar fills. Returns an effect which will remove
6271
-- | the callback from the pending queue.
6372
takeVar eff a. AVar a AVarCallback eff a AVarEff eff (AVarEff eff Unit)
64-
takeVar avar cb = Fn.runFn4 _takeVar Left Right avar cb
73+
takeVar avar cb = Fn.runFn3 _takeVar ffiUtil avar cb
6574

6675
-- | Attempts to synchronously take an AVar value, leaving it empty. If the
6776
-- | AVar is empty, this will return `Nothing`.
6877
tryTakeVar eff a. AVar a AVarEff eff (Maybe a)
69-
tryTakeVar avar = Fn.runFn5 _tryTakeVar Left Right Nothing Just avar
78+
tryTakeVar avar = Fn.runFn2 _tryTakeVar ffiUtil avar
7079

7180
-- | Reads the AVar value. Unlike `takeVar`, this will not leave the AVar empty.
7281
-- | If the AVar is empty, this will queue until it is filled. Multiple reads
7382
-- | will resolve at the same time, as soon as possible.
7483
readVar eff a. AVar a AVarCallback eff a AVarEff eff (AVarEff eff Unit)
75-
readVar avar cb = Fn.runFn4 _readVar Left Right avar cb
84+
readVar avar cb = Fn.runFn3 _readVar ffiUtil avar cb
7685

7786
-- | Attempts to synchronously read an AVar. If the AVar is empty, this will
7887
-- | return `Nothing`.
7988
tryReadVar eff a. AVar a AVarEff eff (Maybe a)
80-
tryReadVar avar = Fn.runFn3 _tryReadVar Nothing Just avar
81-
82-
foreign import _killVar eff a. Fn.Fn4 ( x y. x Either x y) ( x y. y Either x y) (AVar a) Error (AVarEff eff Unit)
83-
foreign import _putVar eff a. Fn.Fn5 ( x y. x Either x y) ( x y. y Either x y) (AVar a) a (AVarCallback eff Unit) (AVarEff eff (AVarEff eff Unit))
84-
foreign import _tryPutVar eff a. Fn.Fn4 ( x y. x Either x y) ( x y. y Either x y) (AVar a) a (AVarEff eff Boolean)
85-
foreign import _takeVar eff a. Fn.Fn4 ( x y. x Either x y) ( x y. y Either x y) (AVar a) (AVarCallback eff a) (AVarEff eff (AVarEff eff Unit))
86-
foreign import _tryTakeVar eff a. Fn.Fn5 ( x y. x Either x y) ( x y. y Either x y) (Maybe a) (a Maybe a) (AVar a) (AVarEff eff (Maybe a))
87-
foreign import _readVar eff a. Fn.Fn4 ( x y. x Either x y) ( x y. y Either x y) (AVar a) (AVarCallback eff a) (AVarEff eff (AVarEff eff Unit))
88-
foreign import _tryReadVar eff a. Fn.Fn3 (Maybe a) (a Maybe a) (AVar a) (AVarEff eff (Maybe a))
89+
tryReadVar avar = Fn.runFn2 _tryReadVar ffiUtil avar
90+
91+
-- | Synchronously checks the status of an AVar.
92+
status eff a. AVar a AVarEff eff (AVarStatus a)
93+
status avar = Fn.runFn2 _status ffiUtil avar
94+
95+
-- | Synchronously checks whether an AVar currently is empty.
96+
isEmptyVar eff a. AVar a AVarEff eff Boolean
97+
isEmptyVar = map isEmpty <<< status
98+
99+
-- | Synchronously checks whether an AVar currently has a value.
100+
isFilledVar eff a. AVar a AVarEff eff Boolean
101+
isFilledVar = map isFilled <<< status
102+
103+
-- | Synchronously checks whether an AVar has been killed.
104+
isKilledVar eff a. AVar a AVarEff eff Boolean
105+
isKilledVar = map isKilled <<< status
106+
107+
isEmpty a. AVarStatus a Boolean
108+
isEmpty = case _ of
109+
Emptytrue
110+
_ → false
111+
112+
isFilled a. AVarStatus a Boolean
113+
isFilled = case _ of
114+
Filled _ → true
115+
_ → false
116+
117+
isKilled a. AVarStatus a Boolean
118+
isKilled = case _ of
119+
Killed _ → true
120+
_ → false
121+
122+
foreign import _killVar eff a. Fn.Fn3 FFIUtil Error (AVar a) (AVarEff eff Unit)
123+
foreign import _putVar eff a. Fn.Fn4 FFIUtil a (AVar a) (AVarCallback eff Unit) (AVarEff eff (AVarEff eff Unit))
124+
foreign import _tryPutVar eff a. Fn.Fn3 FFIUtil a (AVar a) (AVarEff eff Boolean)
125+
foreign import _takeVar eff a. Fn.Fn3 FFIUtil (AVar a) (AVarCallback eff a) (AVarEff eff (AVarEff eff Unit))
126+
foreign import _tryTakeVar eff a. Fn.Fn2 FFIUtil (AVar a) (AVarEff eff (Maybe a))
127+
foreign import _readVar eff a. Fn.Fn3 FFIUtil (AVar a) (AVarCallback eff a) (AVarEff eff (AVarEff eff Unit))
128+
foreign import _tryReadVar eff a. Fn.Fn2 FFIUtil (AVar a) (AVarEff eff (Maybe a))
129+
foreign import _status eff a. Fn.Fn2 FFIUtil (AVar a) (AVarEff eff (AVarStatus a))
130+
131+
type FFIUtil =
132+
{ left a b. a Either a b
133+
, right a b. b Either a b
134+
, nothing a. Maybe a
135+
, just a. a Maybe a
136+
, killed a. Error AVarStatus a
137+
, filled a. a AVarStatus a
138+
, empty a. AVarStatus a
139+
}
140+
141+
ffiUtil FFIUtil
142+
ffiUtil =
143+
{ left: Left
144+
, right: Right
145+
, nothing: Nothing
146+
, just: Just
147+
, killed: Killed
148+
, filled: Filled
149+
, empty: Empty
150+
}

0 commit comments

Comments
 (0)