module Control.Distributed.STM.Utils ((>>+), (+>>), insertWith, showJustify,
replaceListElems, updateListElems) where
(>>+) :: IO Bool -> IO Bool -> IO Bool
a1 >>+ a2 = do
b <- a1
if b then a2
else return False
(+>>) :: Bool -> IO Bool -> IO Bool
b +>> a = if b then a else return False
insertWith :: Ord a => (b -> b -> b) -> a -> b -> [(a, b)] -> [(a, b)]
insertWith _ key new [] = [(key, new)]
insertWith upd key new ((k, old) : kvs)
| key == k = (k, upd new old) : kvs
| key > k = (k, old) : insertWith upd key new kvs
| otherwise = (key, new) : (k, old) : kvs
replaceListElems :: Eq a => b -> a -> [(a,b)] -> [(a,b)]
replaceListElems val key [] = [(key, val)]
replaceListElems val key ((k,v):kvs) | key == k = (k, val) : kvs
| otherwise = (k,v)
:replaceListElems val key kvs
updateListElems :: Eq a => (b -> b) -> b -> a -> [(a,b)] -> [(a,b)]
updateListElems _ val key [] = [(key, val)]
updateListElems f v0 key ((k,v):kvs) | key == k = (k, f v) : kvs
| otherwise = (k,v)
:updateListElems f v0 key kvs
showJustify :: Show a => a -> Int -> String
showJustify i len = let s = show i in (replicate (len length s) ' ') ++ s