例えば、@Thread()というカレントメッセージを含むスレッドの全てのメッセージリストを返す関数を追加したとします。特定のフォルダにあるメッセージだけを検索対象にするなら、@Thread(@Folder())のようにフォルダ名を指定可能にするというのもありかもしれません。でもって、そのスレッド内に未読メッセージがあるかどうかを判定するなら、
@Progn(@ForEach(@Thread(), @If(@Not(@Seen()), @Set('Unseen', @True()), @False())) $Uneen)
とすることができそうです。本当は一つでも未読があったならば、そこでループを打ち切りたいところなので、@ForEachに終了条件を付けてみるというのもありかもしれません。もしくは、@FindEachという関数を追加して、
@FindEach(@Thread(), @Not(@Seen()))
とすると、メッセージリストのはじめから二番目の引数の式を評価していって、真になったらその値を返すとか。現在のフォルダ内でスレッド内に自分が出したメッセージが含まれるかどうかを検証するならば、
@FindEach(@Thread(@Folder()), @Equal(@Address(From), @Address(@I()))))
となるでしょうか。
判定条件と返す値を変えたいというケースも考えると、@FindEach(MessageList, Expr, Expr?)として、例えば、スレッド内の最初の未読メッセージのSubjectを返すならば、
@FindEach(@Thread(), @Not(@Seen()), Subject)
なんてことができる、というのも面白いかもしれません。
@ForEach系はカレントメッセージが引数として暗黙に渡されるクロージャーのように使えるので、遊ぼうと思うと色々と遊べそうです。やりすぎるとわけわからなくなっちゃいますけど。