functor
import
Tk
Plan(make: MakePlan)
Widgets(history: History
truck: Truck)
AgentAbstractions(new: NewAgent
contract: Contract)
export
Broker
Company
Driver
define
class Broker
from Contract History
prop final
feat toplevel map
meth init(toplevel:T)
Contract, init
History, init(master:T suffix:'Broker')
self.toplevel = T
end
meth announce(...) = M
A R
in
Contract, {Adjoin M announce(answer:?A reply:R)}
if A\=reject then
R=grant
end
History, M
end
meth add(company:C driver:D<=unit ...) = M
if D==unit then
Contract,add(C {NewAgent Company
init(name:C toplevel:self.toplevel)})
else
{Contract,get(C $) add(driver:D city:M.city)}
end
end
meth remove(company:C driver:D<=unit)
if D==unit then Contract,remove(C) else
{Contract,get(C $) remove(D)}
end
end
meth close
History, tkClose
Contract, close
end
end
class Company
from Contract History
prop final
feat toplevel
meth init(toplevel:T name:C)
Contract, init
History, init(master:T suffix:C)
self.toplevel = T
end
meth announce(answer:A reply:R ...) = Announcement
Contract, Announcement
History, Announcement
end
meth add(driver:D city:C)
T = self.toplevel
ThisDriver = {NewAgent Driver init(toplevel:T name:D city:C
truck:ThisTruck)}
ThisTruck = {NewAgent Truck init(parent:T.map city:C
driver:ThisDriver)}
in
Contract, add(D ThisDriver)
end
meth close
History, tkClose
Contract, close
end
end
class Driver
from History
prop final
feat truck
attr plan:nil status:idle
meth init(toplevel:M name:N truck:T city:C)
History, init(master:M suffix:N)
plan <- [act(city:C load:0 lift:nil drop:nil)]
%% self.truck = T
end
meth deiconify
{Tk.send wm(deiconify self)}
end
meth announce(answer:A reply:R ...) = Announce
NewPlan
in
{MakePlan @plan Announce ?A ?NewPlan}
case R
of reject then skip
[] grant then plan <- NewPlan
end
History, Announce
Driver, check
end
meth check
case @status
of closed then {self.truck close}
[] idle then
N={Length @plan}
in
if N>1 then
case @plan of
act(load:Load ...)|act(load:NewLoad city:Dst ...)|_
then
plan <- @plan.2
if N>2 then status <- active
end
{self.truck drive(Dst Load NewLoad)}
end
end
[] active then skip
end
end
meth getMessage($)
case @status
of closed then close
[] idle then
History, print('idle.')
load(0)
[] active then
case @plan of
act(load:Load ...)|act(load:NewLoad city:Dst ...)|_
then
plan <- @plan.2
if {Length @plan}=<1 then
status <- idle
end
drive(Dst Load NewLoad)
end
end
end
meth close
History, tkClose
if @status==idle then
{self.truck close}
else
status <- closed
end
end
end
end