{- - Agent implementation in Pict -} import "types" import "event" def agent (n:String) : Agent = (new name:^String run name!n new friends:^(List Agent) run friends!nil new wannaBe:^(List Agent) run wannaBe!nil new space:^(List Event) run space!nil (rec [ toString = \[res:!String] = name?n = ( res!n | name!n ) sendFriendReq = \[self:Agent a:Agent c:Sig] = (val (rec aa) = a friends?f = (friends!f | if (contains #Agent f a eqAgent) then ((prNL (+$ "Already friends with: " (aa.toString))) ; ()) else (((prNL "Sending friend request..."); ()) | wannaBe?w = (wannaBe!(cons a w) | ((aa.friendReq a self); ()) ) ) | c![] )) friendReq = \[self:Agent a:Agent c:Sig] = (((prNL "Received friend request..."); ()) | (val (rec aa) = a friends?f = if (contains #Agent f a eqAgent) then (friends!f | ((prNL (+$ "Already friends with: " (aa.toString))) ; ())) else wannaBe?w = if (contains #Agent w a eqAgent) then (wannaBe!(remove #Agent w a eqAgent) | friends!(cons a f) | ((aa.friendReq a self); ()) ) else () ) | c![] ) removeFriend = \[self:Agent a:Agent c:Sig] = (((prNL "Removing friend..."); ()) | (val (rec aa) = a friends?f = if (not (contains #Agent f a eqAgent)) then (friends!f | ((prNL (+$ "Not friends with: " (aa.toString))) ; ())) else (friends!(remove #Agent f a eqAgent) | ((aa.removeFriend a self); ()) ) ) | c![] ) publishMyEvent = \[self:Agent s:String c:Sig] = (val e = (event self self s) val (rec ee) = e ee.publish![e c]) publishEvent = \[self:Agent s:String a:Agent c:Sig] = (val (rec aa) = a friends?f = (friends!f | if (not (contains #Agent f a eqAgent)) then (((prNL (+$ "Not friends with: " (aa.toString))); ()) | c![]) else (val e = (event self a s) val (rec ee) = e ee.publish![e c]) )) sendEvent = \[e:Event c:Sig] = friends?f = ( friends!f | list.apply![#Agent f \(a:Agent):[] = (val (rec aa) = a (aa.receiveEvent e)) c] ) receiveEvent = \[e:Event c:Sig] = (space?s = if (not (contains #Event s e eqEvent)) then space!(cons e s) else space!s | c![] ) printSpace = \[c:Sig] = space?s = name?n = (space!s | name!n | ((prNL (+$ > "*** " n "'s Events***")); (list.apply s \(e:Event):[] = (val (rec ee) = e (ee.print))); prNL![(+$ > "*** " n "'s events finished.***") c]) ) ]))