{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE ScopedTypeVariables #-}
module System.FS.Sim.Stream (
Stream
, runStream
, always
, empty
, mkInfinite
, repeating
, unsafeMkFinite
, null
, genFinite
, genInfinite
, genMaybe
, genMaybe'
, shrinkStream
) where
import Control.Monad (replicateM)
import Prelude hiding (null)
import qualified Test.QuickCheck as QC
import Test.QuickCheck (Gen)
data Stream a = Stream {
forall a. Stream a -> InternalInfo
_streamInternalInfo :: InternalInfo
, forall a. Stream a -> [Maybe a]
_getStream :: [Maybe a]
}
deriving (forall a b. (a -> b) -> Stream a -> Stream b)
-> (forall a b. a -> Stream b -> Stream a) -> Functor Stream
forall a b. a -> Stream b -> Stream a
forall a b. (a -> b) -> Stream a -> Stream b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Stream a -> Stream b
fmap :: forall a b. (a -> b) -> Stream a -> Stream b
$c<$ :: forall a b. a -> Stream b -> Stream a
<$ :: forall a b. a -> Stream b -> Stream a
Functor
data InternalInfo = Infinite | Finite
instance Show a => Show (Stream a) where
showsPrec :: Int -> Stream a -> ShowS
showsPrec Int
n (Stream InternalInfo
info [Maybe a]
xs) = case InternalInfo
info of
InternalInfo
Infinite -> (String
"<infinite stream>" String -> ShowS
forall a. [a] -> [a] -> [a]
++)
InternalInfo
Finite -> (if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10 then (Char
'('Char -> ShowS
forall a. a -> [a] -> [a]
:) else ShowS
forall a. a -> a
id)
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe a] -> ShowS
forall a. Show a => a -> ShowS
shows [Maybe a]
xs
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
" ++ ..." String -> ShowS
forall a. [a] -> [a] -> [a]
++)
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10 then (Char
')'Char -> ShowS
forall a. a -> [a] -> [a]
:) else ShowS
forall a. a -> a
id)
runStream :: Stream a -> (Maybe a, Stream a)
runStream :: forall a. Stream a -> (Maybe a, Stream a)
runStream s :: Stream a
s@(Stream InternalInfo
_ [] ) = (Maybe a
forall a. Maybe a
Nothing, Stream a
s)
runStream (Stream InternalInfo
info (Maybe a
a:[Maybe a]
as)) = (Maybe a
a, InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
info [Maybe a]
as)
empty :: Stream a
empty :: forall a. Stream a
empty = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Finite []
always :: a -> Stream a
always :: forall a. a -> Stream a
always a
x = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Infinite (Maybe a -> [Maybe a]
forall a. a -> [a]
repeat (a -> Maybe a
forall a. a -> Maybe a
Just a
x))
repeating :: [Maybe a] -> Stream a
repeating :: forall a. [Maybe a] -> Stream a
repeating [Maybe a]
xs = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Infinite ([Maybe a] -> Stream a) -> [Maybe a] -> Stream a
forall a b. (a -> b) -> a -> b
$ [[Maybe a]] -> [Maybe a]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([Maybe a] -> [[Maybe a]]
forall a. a -> [a]
repeat [Maybe a]
xs)
unsafeMkFinite :: [Maybe a] -> Stream a
unsafeMkFinite :: forall a. [Maybe a] -> Stream a
unsafeMkFinite = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Finite
mkInfinite :: [Maybe a] -> Stream a
mkInfinite :: forall a. [Maybe a] -> Stream a
mkInfinite = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Infinite
null :: Stream a -> Bool
null :: forall a. Stream a -> Bool
null (Stream InternalInfo
_ []) = Bool
True
null Stream a
_ = Bool
False
shrinkStream :: Stream a -> [Stream a]
shrinkStream :: forall a. Stream a -> [Stream a]
shrinkStream (Stream InternalInfo
info [Maybe a]
xs0) = case InternalInfo
info of
InternalInfo
Infinite -> InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Finite ([Maybe a] -> Stream a) -> [[Maybe a]] -> [Stream a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Int -> [Maybe a] -> [Maybe a]
forall a. Int -> [a] -> [a]
take Int
n [Maybe a]
xs0 | Int
n <- (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int
2Int -> Int -> Int
forall a b. (Num a, Integral b) => a -> b -> a
^) [Int
0 :: Int ..]]
InternalInfo
Finite -> InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Finite ([Maybe a] -> Stream a) -> [[Maybe a]] -> [Stream a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe a -> [Maybe a]) -> [Maybe a] -> [[Maybe a]]
forall a. (a -> [a]) -> [a] -> [[a]]
QC.shrinkList ([Maybe a] -> Maybe a -> [Maybe a]
forall a b. a -> b -> a
const []) [Maybe a]
xs0
genMaybe ::
Int
-> Int
-> Gen a
-> Gen (Maybe a)
genMaybe :: forall a. Int -> Int -> Gen a -> Gen (Maybe a)
genMaybe Int
nLi Int
jLi Gen a
genA = [(Int, Gen (Maybe a))] -> Gen (Maybe a)
forall a. HasCallStack => [(Int, Gen a)] -> Gen a
QC.frequency
[ (Int
nLi, Maybe a -> Gen (Maybe a)
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing)
, (Int
jLi, a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Gen a -> Gen (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA)
]
genMaybe' ::
Int
-> Gen a
-> Gen (Maybe a)
genMaybe' :: forall a. Int -> Gen a -> Gen (Maybe a)
genMaybe' = Int -> Int -> Gen a -> Gen (Maybe a)
forall a. Int -> Int -> Gen a -> Gen (Maybe a)
genMaybe Int
2
genFinite ::
Int
-> Gen (Maybe a)
-> Gen (Stream a)
genFinite :: forall a. Int -> Gen (Maybe a) -> Gen (Stream a)
genFinite Int
n Gen (Maybe a)
gen = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Finite ([Maybe a] -> Stream a) -> Gen [Maybe a] -> Gen (Stream a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen (Maybe a) -> Gen [Maybe a]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n Gen (Maybe a)
gen
genInfinite ::
Gen (Maybe a)
-> Gen (Stream a)
genInfinite :: forall a. Gen (Maybe a) -> Gen (Stream a)
genInfinite Gen (Maybe a)
gen = InternalInfo -> [Maybe a] -> Stream a
forall a. InternalInfo -> [Maybe a] -> Stream a
Stream InternalInfo
Infinite ([Maybe a] -> Stream a) -> Gen [Maybe a] -> Gen (Stream a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Maybe a) -> Gen [Maybe a]
forall a. Gen a -> Gen [a]
QC.listOf Gen (Maybe a)
gen