module DBus.Util
( hexToInt
, maybeIndex
, readUntil
, dropEnd
, void
, untilM
) where
import Data.Char (digitToInt)
import Data.List (isPrefixOf)
hexToInt :: String -> Int
hexToInt = foldl ((+) . (16 *)) 0 . map digitToInt
maybeIndex :: [a] -> Int -> Maybe a
maybeIndex (x:_ ) 0 = Just x
maybeIndex (_:xs) n | n > 0 = maybeIndex xs (n 1)
maybeIndex _ _ = Nothing
readUntil :: (Monad m, Eq a) => [a] -> m a -> m [a]
readUntil guard getx = readUntil' [] where
guard' = reverse guard
step xs | isPrefixOf guard' xs = return . reverse $ xs
| otherwise = readUntil' xs
readUntil' xs = do
x <- getx
step $ x:xs
dropEnd :: Int -> [a] -> [a]
dropEnd n xs = take (length xs n) xs
void :: Monad m => m a -> m ()
void m = m >> return ()
untilM :: Monad m => m Bool -> m a -> m [a]
untilM test comp = do
done <- test
if done
then return []
else do
x <- comp
xs <- untilM test comp
return (x:xs)