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