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

module Data.GenValidity.Vector where

import Data.GenValidity
import Data.Validity.Vector ()
import qualified Data.Vector as V
import qualified Data.Vector.Storable as SV

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

instance (SV.Storable e, GenValid e) => GenValid (SV.Vector e) where
  genValid :: Gen (Vector e)
genValid = [e] -> Vector e
forall a. Storable a => [a] -> Vector a
SV.fromList ([e] -> Vector e) -> Gen [e] -> Gen (Vector e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [e]
forall a. GenValid a => Gen a
genValid
  shrinkValid :: Vector e -> [Vector e]
shrinkValid = ([e] -> Vector e) -> [[e]] -> [Vector e]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [e] -> Vector e
forall a. Storable a => [a] -> Vector a
SV.fromList ([[e]] -> [Vector e])
-> (Vector e -> [[e]]) -> Vector e -> [Vector e]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [e] -> [[e]]
forall a. GenValid a => a -> [a]
shrinkValid ([e] -> [[e]]) -> (Vector e -> [e]) -> Vector e -> [[e]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector e -> [e]
forall a. Storable a => Vector a -> [a]
SV.toList