packages feed

kazura-queue-0.1.0.3: test/Test/Util.hs

{-# LANGUAGE TupleSections #-}

module Test.Util where

import qualified Test.QuickCheck as Q

import qualified Control.Exception as E
import qualified Control.Monad     as M

import qualified Data.List as L

orElse :: IO x -> IO x -> IO x
orElse io1 io2 = io1 `E.catch` \ (E.SomeException _) -> io2

oneOf :: [IO x] -> IO x
oneOf (io:[])  = io
oneOf (io:ios) = io `orElse` oneOf ios
oneOf []       = error "actions must include at least one element"

oneOfWithIndex :: [IO x] -> IO (x, Int)
oneOfWithIndex = go 0
  where
    go _ []       = error "actions must include at least one element"
    go x (io:[])  = (, x) <$> io
    go x (io:ios) = ((, x) <$> io)
        `E.catch` \ (E.SomeException _) -> go (x+1) ios

genSatisfy :: Q.Arbitrary a => Int -> (a -> Bool) -> IO [a]
genSatisfy num f = M.replicateM num . Q.generate $ Q.arbitrary `Q.suchThat` f

pickUp :: Int -> [x] -> (x, [x])
pickUp idx xs = (rx, hxs ++ drop 1 txs)
  where
    (hxs, txs) = L.splitAt idx xs
    rx = case take 1 txs of
        r:_ -> r
        _   -> error "invalid index to pickUp"