/
AgentTask.sarl
162 lines (141 loc) · 3.94 KB
/
AgentTask.sarl
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
* $Id$
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2017 the original authors or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.sarl.core
import io.sarl.lang.annotation.PrivateAPI
import io.sarl.lang.core.Agent
import io.sarl.lang.core.SRESpecificDataContainer
/**
* Description of a task an agent has schedule to be performed at a later time.
*
* @author $Author: srodriguez$
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
class AgentTask extends SRESpecificDataContainer {
/** A guard that is always true.
*/
public static val TRUE_GUARD : (Agent) => boolean = [ true ]
/** A guard that is always false.
*/
public static val FALSE_GUARD : (Agent) => boolean = [ false ]
var name : String
var guard : (Agent) => boolean
var procedure : (Agent) => void
val initiator : Object
/** Construct an AgentTask with the given initiator.
* @param initiator the object that has initiated the execution of this task.
* If the value is {@code null} (the default value of the argument), the agent is assumed to
* be the initiator.
*/
new(initiator : Object = null) {
this.initiator = initiator
}
/** Replies the procedure that is associated to this task.
*
* @return the procedure to run.
*/
def getProcedure : (Agent) => void {
this.procedure
}
/** Change the procedure associated to this task.
*
* @param procedure code of the procedure to associate to the task.
*/
def setProcedure(procedure : (Agent) => void) : void {
this.procedure = procedure
}
/** Replies the guard of this task.
*
* @return the guard.
*/
def getGuard : (Agent) => boolean {
this.guard
}
/** Change the guard of this task.
*
* @param guard the code of the function that is the predicate associated to the guard.
* @see #unless
* @see #ifTrue
*/
def setGuard(guard : (Agent) => boolean) : void {
this.guard = guard
}
/** Replies the name of this task.
*
* @return the name.
*/
def getName : String {
this.name
}
/** Change the name of this task.
*
* @param name name of the task.
* @since 0.7, it is part of the private API.
* @privateapi
*/
@PrivateAPI
def setTaskName(name : String) : void {
this.name = name
}
/** Change the guard of this that with the negation of the given predicate.
*
* @param predicate the code of the function that is the predicate to test.
* @return <code>this</code>.
* @see #setGuard
*/
def unless(predicate : (Agent) => boolean) : AgentTask {
if (predicate === null) {
this.guard = FALSE_GUARD
} else {
this.guard = [ !predicate.apply(it) ]
}
return this
}
/** Change the guard to the given predicate.
*
* @param predicate the code of the function that is the predicate to test.
* @return <code>this</code>.
* @see #setGuard
*/
def ifTrue(predicate : (Agent) => boolean) : AgentTask {
if (predicate === null) {
this.guard = null
} else {
this.guard = predicate
}
return this
}
override toString : String {
"AgentTask: " + this.name
}
/**
* Replies the object that has initiated the execution of this task.
* If the value replied by this function is {@code null}, the agent is assumed to be the initiator.
*
* @return the initiator, or {@code null} if the initiator is the agent itself.
* @since 0.5
*/
def getInitiator : Object {
this.initiator
}
}