236:-
meta_predicate(set_alarm(+,
0,
-)).
237:-
meta_predicate(time_out_call_once(+,
0,
-)).
238:-
meta_predicate(prove_once(
0)).
246get_next_identity(
ID)
:-
253 get_next_identity(
ID),
get_next_identity,
254 bb_put(alarms, [alarm(
Seconds,
ID,
Execute)]),
255 alarm(
Seconds, alarm_handler,
_).
265 get_next_identity(
ID),
get_next_identity,
266 bb_get(alarms, [alarm(
CurrentSeconds,
CurrentID,
CurrentExecute)
|Alarms]),
267 alarm(
0, true,
Remaining),
268 Elapsed is CurrentSeconds - Remaining - 1,
269 maplist(subtract(
Elapsed), [alarm(
CurrentSeconds,
CurrentID,
CurrentExecute)
|Alarms],
RemainingAlarms),
270 ord_add_element(
RemainingAlarms, alarm(
Seconds,
ID,
Execute), [alarm(
NewSeconds,
NewID,
NewToExecute)
|NewAlarms]),
271 bb_put(alarms, [alarm(
NewSeconds,
NewID,
NewToExecute)
|NewAlarms]),
272 alarm(
NewSeconds, alarm_handler,
_).
274 throw(error(permission_error(create, alarm, set_alarm(
Seconds,
Execute,
ID)),
'Non permitted alarm identifier.')).
276subtract(
Elapsed, alarm(
Seconds,
ID,
Execute), alarm(
NewSeconds,
ID,
Execute))
:-
277 NewSeconds is Seconds - Elapsed.
286 throw(error(instantiation_error,
'Alarm ID needs to be instantiated.')).
289 \+ memberchk(alarm(
_Seconds,
ID,
_Execute),
Alarms),
290 throw(error(existence_error(alarm, unset_alarm(
ID)),
'Alarm does not exist.')).
292 alarm(
0, true,
Remaining),
294 [
alarm(
Seconds,
_,
_)
|_]
= Alarms,
295 Elapsed is Seconds - Remaining - 1,
296 delete_alarm(
Alarms,
ID,
NewAlarms),
297 bb_put(alarms,
NewAlarms),
298 (
NewAlarms = [
alarm(
NewSeconds,
_,
_)
|_]
->
299 RemainingSeconds is NewSeconds - Elapsed,
300 alarm(
RemainingSeconds, alarm_handler,
_)
305delete_alarm(
Alarms,
ID,
NewAlarms)
:-
306 memberchk(alarm(
Seconds,
ID,
Execute),
Alarms),
307 delete(
Alarms, alarm(
Seconds,
ID,
Execute),
NewAlarms).
310 bb_get(alarms, [alarm(
_,
_,
CurrentExecute)
|[]]),
312 call(
CurrentExecute).
314 bb_get(alarms, [alarm(
Elapsed,
CurrentID,
CurrentExecute)
|Alarms]),
315 maplist(subtract(
Elapsed),
Alarms,
NewAlarms),
316 find_zeros(
NewAlarms,
ZeroAlarms),
317 findall(alarm(
S,
ID,
E), (member(alarm(
S,
ID,
E),
NewAlarms),
S > 0),
NonZeroAlarms),
318 bb_put(alarms,
NonZeroAlarms),
319 (
NonZeroAlarms = [
alarm(
NewSeconds,
_,
_)
|_]
->
320 alarm(
NewSeconds, alarm_handler,
_)
324 execute([alarm(
0,
CurrentID,
CurrentExecute)
|ZeroAlarms]).
327find_zeros([alarm(
0,
ID,
E)
|T], [alarm(
0,
ID,
E)
|R])
:-
329find_zeros([alarm(
S,
_,
_)
|T],
R)
:-
334execute([alarm(
_,
_,
Execute)
|R])
:-
342time_out_call_once(
Seconds,
Goal,
Return)
:-
344 set_alarm(
Seconds, throw(timeout(
ID)),
ID),
346 prove_once(
Goal,
Return),
349 (
Exception == timeout(
ID)
->
356prove_once(
Goal, success)
:-
358prove_once(
_Goal, failure).
362 throw(error(instantiation_error,
'Timer name needs to be instantiated.')).
364 '$timer'(
Name,
_,
_),
365 throw(error(permission_error(create, timer, timer_start(
Name)),
'Timer already exists.')).
368 assertz(
'$timer'(
Name, running,
StartTime)).
372 throw(error(instantiation_error,
'Timer name needs to be instantiated.')).
374 \+ '$timer'(
Name,
_,
_),
'$timer',
376 assertz(
'$timer'(
Name, running,
StartTime)).
378 retract(
'$timer'(
Name, running,
_)),
retract,
380 assertz(
'$timer'(
Name, running,
StartTime)).
382 retract(
'$timer'(
Name, paused,
Duration)),
384 Elapsed is StartTime - Duration,
385 assertz(
'$timer'(
Name, running,
Elapsed)).
387timer_stop(
Name,
Elapsed)
:-
388 \+ '$timer'(
Name,
_,
_),
389 throw(error(existence_error(timer, timer_stop(
Name,
Elapsed)),
'Timer does not exist.')).
390timer_stop(
Name,
Elapsed)
:-
391 retract(
'$timer'(
Name, running,
StartTime)),
retract,
393 Elapsed is EndTime - StartTime.
394timer_stop(
Name,
Elapsed)
:-
395 retract(
'$timer'(
Name, paused,
Elapsed)).
397timer_elapsed(
Name,
Elapsed)
:-
398 \+ '$timer'(
Name,
_,
_),
399 throw(error(existence_error(timer, timer_elapsed(
Name,
Elapsed)),
'Timer does not exist.')).
400timer_elapsed(
Name,
Elapsed)
:-
401 '$timer'(
Name, running,
StartTime),
'$timer',
403 Elapsed is EndTime - StartTime.
404timer_elapsed(
Name,
Elapsed)
:-
405 '$timer'(
Name, paused,
Elapsed).
407timer_pause(
Name,
Elapsed)
:-
408 \+ '$timer'(
Name,
_,
_),
409 throw(error(existence_error(timer, timer_pause(
Name,
Elapsed)),
'Timer does not exist.')).
410timer_pause(
Name,
Elapsed)
:-
411 '$timer'(
Name, paused,
_),
412 throw(error(permission_error(timer, timer_pause(
Name,
Elapsed)),
'Timer already paused.')).
413timer_pause(
Name,
Elapsed)
:-
414 retract(
'$timer'(
Name,
_,
StartTime)),
416 Elapsed is EndTime - StartTime,
417 assertz(
'$timer'(
Name, paused,
Elapsed)).
422alarm(+ Seconds,+ Callable,+ OldAlarm)
catch( : Goal,+ Exception,+ Action)
statistics(? Param,- Info)
set_alarm(+Seconds, +Execute, -ID)
delete(+ List, ? Element, ? Residue)
member(?Element, ?Set) is true when Set is a list, and Element occurs in it
memberchk(+ Element, + Set)
maplist( 2:Pred, + List1,+ List2)
ord_add_element(+ Set1, + Element, ? Set2)