{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE CPP #-}

module Data.GenValidity.Sequence where
#if !MIN_VERSION_base(4,8,0)
import Data.Functor ((<$>))
#endif
import Data.Foldable (toList)
import Data.GenValidity
import Data.Validity.Sequence ()

import Data.Sequence (Seq)
import qualified Data.Sequence as S

instance GenUnchecked v => GenUnchecked (Seq v) where
    genUnchecked :: Gen (Seq v)
genUnchecked = [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([v] -> Seq v) -> Gen [v] -> Gen (Seq v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [v]
forall a. GenUnchecked a => Gen a
genUnchecked
    shrinkUnchecked :: Seq v -> [Seq v]
shrinkUnchecked = ([v] -> Seq v) -> [[v]] -> [Seq v]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([[v]] -> [Seq v]) -> (Seq v -> [[v]]) -> Seq v -> [Seq v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> [[v]]
forall a. GenUnchecked a => a -> [a]
shrinkUnchecked ([v] -> [[v]]) -> (Seq v -> [v]) -> Seq v -> [[v]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seq v -> [v]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList

instance GenValid v => GenValid (Seq v) where
    genValid :: Gen (Seq v)
genValid = [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([v] -> Seq v) -> Gen [v] -> Gen (Seq v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [v]
forall a. GenValid a => Gen a
genValid
    shrinkValid :: Seq v -> [Seq v]
shrinkValid = ([v] -> Seq v) -> [[v]] -> [Seq v]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([[v]] -> [Seq v]) -> (Seq v -> [[v]]) -> Seq v -> [Seq v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> [[v]]
forall a. GenValid a => a -> [a]
shrinkValid ([v] -> [[v]]) -> (Seq v -> [v]) -> Seq v -> [[v]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seq v -> [v]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList

instance (GenUnchecked v, GenInvalid v) => GenInvalid (Seq v) where
    genInvalid :: Gen (Seq v)
genInvalid = [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([v] -> Seq v) -> Gen [v] -> Gen (Seq v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [v]
forall a. GenInvalid a => Gen a
genInvalid
    shrinkInvalid :: Seq v -> [Seq v]
shrinkInvalid = ([v] -> Seq v) -> [[v]] -> [Seq v]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [v] -> Seq v
forall a. [a] -> Seq a
S.fromList ([[v]] -> [Seq v]) -> (Seq v -> [[v]]) -> Seq v -> [Seq v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> [[v]]
forall a. GenInvalid a => a -> [a]
shrinkInvalid ([v] -> [[v]]) -> (Seq v -> [v]) -> Seq v -> [[v]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seq v -> [v]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList