Skip to content

Commit

Permalink
Removed overloaded relay
Browse files Browse the repository at this point in the history
  • Loading branch information
devlaam committed May 18, 2023
1 parent bedcbf6 commit 67d988e
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 17 deletions.
12 changes: 9 additions & 3 deletions shared/src/main/scala/s2a/leucine/actors/user/accept.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,23 @@ abstract class AcceptActor[Define <: AcceptDefine](private[actors] val actorDefi

/* Use to distinguish between basic and other actors. AcceptActors does not have sender as parameter. */
extension (fc: FamilyRelay { type FamilyAccept = Actor } )
/**
* Forward a message to all children with indexed name, workers and auto named.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relayAll(letter: fc.MyFamilyLetter[fc.FamilyAccept]): Int =
fc.relayEnvGrouped(letter,Actor.Anonymous,true,true,true)
/**
* Forward a message to children of which the name passes the test 'include'.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relay(letter: fc.MyFamilyLetter[fc.FamilyAccept], include: String => Boolean): Int =
protected def relayFilter(letter: fc.MyFamilyLetter[fc.FamilyAccept], include: String => Boolean): Int =
fc.relayEnvFilter(letter,Actor.Anonymous,include)
/**
* Forward a message to children that are indexed and/or workers and or children that were given
* Forward a message to children per group: indexed and/or workers and/or children that were given
* an automatic name, i.e. children that were not given an explicit name.
* Returns the number of children that accepted the letter. */
protected def relay(letter: fc.MyFamilyLetter[fc.FamilyAccept], toIndexed: Boolean = true, toWorkers: Boolean = false, toAutoNamed: Boolean = false): Int =
protected def relayGrouped(letter: fc.MyFamilyLetter[fc.FamilyAccept], toIndexed: Boolean, toWorkers: Boolean, toAutoNamed: Boolean): Int =
fc.relayEnvGrouped(letter,Actor.Anonymous,toIndexed,toWorkers,toAutoNamed)
/**
* Forward a message to one specific child on the basis of its name. Returns true if successful and
Expand Down
12 changes: 9 additions & 3 deletions shared/src/main/scala/s2a/leucine/actors/user/restrict.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,23 @@ abstract class RestrictActor[Define <: RestrictDefine](private[actors] val actor

/* Use to distinguish between basic and other actors. AcceptActors does not have sender as parameter. */
extension (fc: FamilyRelay)
/**
* Forward a message to all children with indexed name, workers and auto named.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relayAll[Sender >: fc.FamilyCommon <: fc.FamilyAccept](letter: fc.MyFamilyLetter[Sender], sender: Sender): Int =
fc.relayEnvGrouped(letter,sender,true,true,true)
/**
* Forward a message to children of which the name passes the test 'include'.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relay[Sender >: fc.FamilyCommon <: fc.FamilyAccept](letter: fc.MyFamilyLetter[Sender], sender: Sender, include: String => Boolean): Int =
protected def relayFilter[Sender >: fc.FamilyCommon <: fc.FamilyAccept](letter: fc.MyFamilyLetter[Sender], sender: Sender, include: String => Boolean): Int =
fc.relayEnvFilter(letter,sender,include)
/**
* Forward a message to children that are indexed and/or workers and or children that were given
* Forward a message to children per group: indexed and/or workers and/or children that were given
* an automatic name, i.e. children that were not given an explicit name.
* Returns the number of children that accepted the letter. */
protected def relay[Sender >: fc.FamilyCommon <: fc.FamilyAccept](letter: fc.MyFamilyLetter[Sender], sender: Sender, toIndexed: Boolean = true, toWorkers: Boolean = false, toAutoNamed: Boolean = false): Int =
protected def relayGrouped[Sender >: fc.FamilyCommon <: fc.FamilyAccept](letter: fc.MyFamilyLetter[Sender], sender: Sender, toIndexed: Boolean, toWorkers: Boolean, toAutoNamed: Boolean): Int =
fc.relayEnvGrouped(letter,sender,toIndexed,toWorkers,toAutoNamed)
/**
* Forward a message to one specific child on the basis of its name. Returns true if successful and
Expand Down
12 changes: 9 additions & 3 deletions shared/src/main/scala/s2a/leucine/actors/user/select.scala
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,23 @@ abstract class SelectActor[Define <: SelectDefine](private[actors] val actorDefi

/* Use to distinguish between basic and other actors. AcceptActors does not have sender as parameter. */
extension (fc: FamilyRelay { type Sender = FamilyAccept } )
/**
* Forward a message to all children with indexed name, workers and auto named.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relayAll(letter: fc.MyFamilyLetter[fc.FamilyAccept], sender: fc.Sender): Int =
fc.relayEnvGrouped(letter,sender,true,true,true)
/**
* Forward a message to children of which the name passes the test 'include'.
* Returns the number of children that accepted the letter. Does not include
* auto named children (children that were not given an explicit name) or workers. */
protected def relay(letter: fc.MyFamilyLetter[fc.FamilyAccept], sender: fc.Sender, include: String => Boolean): Int =
protected def relayFilter(letter: fc.MyFamilyLetter[fc.FamilyAccept], sender: fc.Sender, include: String => Boolean): Int =
fc.relayEnvFilter(letter,sender,include)
/**
* Forward a message to children that are indexed and/or workers and or children that were given
* Forward a message to children per group: indexed and/or workers and/or children that were given
* an automatic name, i.e. children that were not given an explicit name.
* Returns the number of children that accepted the letter. */
protected def relay(letter: fc.MyFamilyLetter[fc.FamilyAccept], sender: fc.Sender, toIndexed: Boolean = true, toWorkers: Boolean = false, toAutoNamed: Boolean = false): Int =
protected def relayGrouped(letter: fc.MyFamilyLetter[fc.FamilyAccept], sender: fc.Sender, toIndexed: Boolean, toWorkers: Boolean, toAutoNamed: Boolean): Int =
fc.relayEnvGrouped(letter,sender,toIndexed,toWorkers,toAutoNamed)
/**
* Forward a message to one specific child on the basis of its name. Returns true if successful and
Expand Down
4 changes: 2 additions & 2 deletions shared/src/main/scala/s2a/leucine/demo/trace/tree.scala
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,12 @@ class Tree(name: String, val parent: Option[Tree]) extends RestrictActor(Tree,na
(1 to width).foreach(newChild)
/* In case we are not yet on the last level, relay this creation order
* to the next level. */
if (level > 1) then relay(Tree.Create(width,level - 1),this)
if (level > 1) then relayAll(Tree.Create(width,level - 1),this)
case Tree.Forward =>
/* Report that we are in the forward traversal. */
write("=>>")
/* Relay the message to all children, and see if we succeeded. */
val relayed = relay(Tree.Forward,this)
val relayed = relayAll(Tree.Forward,this)
/* In case there were no children to accept the message, we are at the
* end of the structure and start the traversal backwards. */
if relayed == 0 then parent.map(_ ! Tree.Backward)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ trait ActorTreeSupply :
case Tree.Create(width,level) =>
if parent.isEmpty then returns = -(width**level)
(1 to width).foreach(newChild)
if (level > 1) then relay(Tree.Create(width,level - 1),this)
if (level > 1) then relayAll(Tree.Create(width,level - 1),this)
case Tree.Forward(bounce) =>
write("=>>")
val relayed = relay(Tree.Forward(bounce),this)
val relayed = relayAll(Tree.Forward(bounce),this)
if bounce && (relayed == 0) then parent.map(_ ! Tree.Backward)
case Tree.Backward =>
write("<<=")
Expand All @@ -46,7 +46,7 @@ trait ActorTreeSupply :
case Tree.Stop =>
write("=>>")
if parent.isEmpty then stop(Actor.Stop.Barren)
val relayed = relay(Tree.Stop,this)
val relayed = relayAll(Tree.Stop,this)
if relayed == 0 then stop(Actor.Stop.Direct)

object Tree extends RestrictDefine, Stateless :
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ object ActorFamilySupply extends TestSuite :
sealed trait Letter[Sender <: Accept] extends Actor.Letter[Sender]
case object Test0 extends Letter[Accept]
type FamilyAccept = Accept & Level1A_.Accept & Level1B_.Accept & Level1C_.Accept
type MyFamilyLetter[Sender <: FamilyAccept] = Letter[Sender] & Level1A_.Letter[Sender] & Level1B_.Letter[Sender] & Level1C_.Letter[Sender]
type FamilyCommon = Nothing
type MyFamilyLetter[Sender >: FamilyCommon <: FamilyAccept] = Letter[Sender] & Level1A_.Letter[Sender] & Level1B_.Letter[Sender] & Level1C_.Letter[Sender]
/* TODO: This is still problematic, but we must be able to define common letters. */
case object Common extends Letter[Anonymous], Level1A_.Letter[Anonymous], Level1B_.Letter[Anonymous], Level1C_.Letter[Anonymous]

Expand Down Expand Up @@ -123,8 +124,8 @@ object ActorFamilySupply extends TestSuite :
/* For the moment we just test if an error occurs, but we do not check the content for the error message is not stable. */
compileError("level1C.send(Level1C_.Text(\"ba\"),level1B)").msg.clean(5) ==> "Found"
compileError("level1B.send(Level1B_.Test1B,this)").msg.clean(5) ==> "Found"
compileError("relay(Level1A_.Test1A,outside)").msg ==> "Found"
compileError("relay(Level1B_.Test1B,outside)").msg.clean(5) ==> "Found"
compileError("relayAll(Level1A_.Test1A,outside)").msg.clean(5) ==> "Found"
compileError("relayAll(Level1B_.Test1B,outside)").msg.clean(5) ==> "Found"
override def receive[Sender <: Accept](letter: MyLetter[Sender], sender: Sender): Unit = super.receive(letter,sender)
/* Testing these hit a compiler bug. */
//(letter,sender) match
Expand Down

0 comments on commit 67d988e

Please sign in to comment.