Guard Conditions

Any statement in a postlude can have an optional guard condition. There are two types of guard conditions: if and on final.  

If

The if guard condition ensures that the postlude statement will only fire if the predicate in the guard is true.

The syntax is

<postlude_statement> if <predicate_expression> 

For example:

fired {
 ent:page_count := ent:page_count + 2 if sunny()
} 

On Final

The on final guard condition ensures that the postlude statement will only fire on the final time through the rule. Normally on final is used inside a foreach loop. 

The syntax is

<postlude_statement> on final 

Rules often raise explicit events in the postlude to signal other rules that they are finished and to indicate their exit state. Usually, a rule only wants to raise such an even once, even if the rule has a foreach statement. For example:

rule show_tweets {
  select when explicit populate
     foreach tweet_list setting (tweet)
       pre {
         ...
       }
       append(...)
       fired {
         raise explicit event "tweets_shown" on final
       } 
} 

In the preceding example, the rule will execute once for each of the tweets in the tweet list, but the explicite event tweets_shown will only be raised once on the final time through the rule. 

The on final guard condition works even when foreach loops are nested. 

Copyright Picolabs | Licensed under Creative Commons.