% $Id: DatingService.oz,v 1.1 2008/04/12 13:29:47 leavens Exp leavens $ \insert 'NewPortObject.oz' declare % Messages sent to the Dating Service % seeking(MySex MeDescription OtherSex OtherDescription ResponsePort) % Messages sent by the Dating service on ResponsePort % list(CompatiblePeople) % match(CompatiblePerson) %% A stub fun {Compatible A B C D} A==B andthen C==D end %% The port object factory fun {NewDatingService} {NewPortObject %% initial state state(women: nil men: nil) %% message fun fun {$ state(women: Women men: Men) Msg} case Msg of seeking(MySex MeDesc OtherSex OtherDesc ResponsePort) then local OtherSexList = if OtherSex==male then Men else Women end Compat = {Filter OtherSexList fun {$ seeking(_ Them DesiredSex DesiredDesc _)} MySex == DesiredSex andthen {Compatible MeDesc DesiredDesc OtherDesc Them} end} in %% Send messages if found anyone compatible if Compat \= nil then {Send ResponsePort list(Compat)} for seeking(_ _ _ _ RP) in Compat do {Send RP match(MySex MeDesc OtherSex OtherDesc ResponsePort)} end end %% Return the new state state(women: if MySex==female then Msg|Women else Women end men: if MySex==male then Msg|Men else Men end) end end end } end