Concurrent Clean : 便利関数 (3)

while系を中断・再開が可能なように、返値を一つ追加しました。

foldUwhile :: (b a -> b) !b ![(.u -> v:(Bool, a, .u))] !.u
                -> (!b, ![(.u -> w:(Bool, a, .u))], !.u)  ,[v <= w]
foldUwhile _ b [] u = (b, [], u)
foldUwhile f b [x:xs] u
    # (c, a, u) = x u
    | c = foldUwhile f (f b a) xs u
        = (b, xs, u)

mapUwhile :: ![(.u -> v:(Bool, a, .u))] !.u
               -> .(![a], ![(.u -> w:(Bool, a, .u))], !.u)  ,[v <= w]
mapUwhile [] u = ([], [], u)
mapUwhile [x:xs] u
    # (c, a, u) = x u
    | c # (as, xr, u) = mapUwhile xs u
        = ([a:as], xr, u)
        = ([a], xs, u)

reelWhile :: ![(.u -> v:(Bool, .u))] !.u
               -> (![(.u -> w:(Bool, .u))], !.u)  ,[v <= w]
reelWhile [] u = ([], u)
reelWhile [x:xs] u
    # (b, u) = x u
    | b = reelWhile xs u
        = (xs, u)

一意型属性の指定がちょっとうるさいですが。
ここで付加した返値によって、一旦中断した処理を、中断したところから再開することができるようになります。