module Test.HTestU.Streaming
( RandomStream
, nextStreamFromGen
, splitNextStreamFromGen
, leftSplitStreamFromGen
, rightSplitStreamFromGen
) where
import System.Random (RandomGen, next, split)
import Data.Tuple (swap)
type RandomStream = [Int]
wrappedNext :: RandomGen g => (Int, g) -> (Int, g)
wrappedNext (_, newGen) = next newGen
nextStreamFromGen :: RandomGen g => g -> RandomStream
nextStreamFromGen gen = map fst $ iterate wrappedNext firstStreamElement
where firstStreamElement = next gen
splitStreamFromGen :: RandomGen g => ((g, g) -> (g, g)) -> g -> RandomStream
splitStreamFromGen choose gen = let (old, new) = choose $ split gen
(value, _) = next old
in value : splitStreamFromGen choose new
goLeft :: (g, g) -> (g, g)
goLeft = id
goRight :: (g, g) -> (g, g)
goRight = swap
leftSplitStreamFromGen :: RandomGen g => g -> RandomStream
leftSplitStreamFromGen = splitStreamFromGen goLeft
rightSplitStreamFromGen :: RandomGen g => g -> RandomStream
rightSplitStreamFromGen = splitStreamFromGen goRight
splitNextStreamFromGen :: RandomGen g => g -> RandomStream
splitNextStreamFromGen gen = intertwineStreams (nextStreamFromGen leftGen) $ nextStreamFromGen rightGen
where (leftGen, rightGen) = split gen
intertwineStreams :: [a] -> [a] -> [a]
intertwineStreams [] ys = ys
intertwineStreams xs [] = xs
intertwineStreams (x : xs) (y : ys) = x : y : intertwineStreams xs ys