unfoldable 0.7.2 → 0.8
raw patch · 5 files changed
+27/−33 lines, 5 filesdep ~QuickCheck
Dependency ranges changed: QuickCheck
Files
- src/Data/Biunfoldable.hs +3/−4
- src/Data/Triunfoldable.hs +3/−4
- src/Data/Unfoldable.hs +3/−4
- src/Data/Unfolder.hs +16/−19
- unfoldable.cabal +2/−2
src/Data/Biunfoldable.hs view
@@ -34,8 +34,7 @@ import Data.Functor.Constant import Control.Monad.Trans.State import qualified System.Random as R-import Test.QuickCheck.Arbitrary (Arbitrary(..))-import Test.QuickCheck.Gen (Gen(..))+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize) import Data.Maybe -- | Data structures with 2 type arguments (kind @* -> * -> *@) that can be unfolded.@@ -95,8 +94,8 @@ -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'. arbitraryDefault :: (Arbitrary a, Arbitrary b, Biunfoldable t) => Gen (t a b)-arbitraryDefault = MkGen $ \r n -> let Arb _ f = biunfold arbUnit arbUnit in - fromMaybe (error "Failed to generate a value.") (f r (n + 1))+arbitraryDefault = let Arb _ gen = biunfold arbUnit arbUnit in + fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen) instance Biunfoldable Either where biunfold fa fb = choose
src/Data/Triunfoldable.hs view
@@ -34,8 +34,7 @@ import Data.Functor.Constant import Control.Monad.Trans.State import qualified System.Random as R-import Test.QuickCheck.Arbitrary (Arbitrary(..))-import Test.QuickCheck.Gen (Gen(..))+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize) import Data.Maybe -- | Data structures with 3 type arguments (kind @* -> * -> * -> *@) that can be unfolded.@@ -98,8 +97,8 @@ -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'. arbitraryDefault :: (Arbitrary a, Arbitrary b, Arbitrary c, Triunfoldable t) => Gen (t a b c)-arbitraryDefault = MkGen $ \r n -> let Arb _ f = triunfold arbUnit arbUnit arbUnit in - fromMaybe (error "Failed to generate a value.") (f r (n + 1))+arbitraryDefault = let Arb _ gen = triunfold arbUnit arbUnit arbUnit in + fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen) curry3 :: ((a,b,c) -> d) -> a -> b -> c -> d
src/Data/Unfoldable.hs view
@@ -46,8 +46,7 @@ import Data.Functor.Reverse import Control.Monad.Trans.State import qualified System.Random as R-import Test.QuickCheck.Arbitrary (Arbitrary(..))-import Test.QuickCheck.Gen (Gen(..))+import Test.QuickCheck (Arbitrary(..), Gen, sized, resize) import Data.Maybe #ifdef GENERICS@@ -181,8 +180,8 @@ -- | Provides a QuickCheck generator, can be used as default instance for 'Arbitrary'. arbitraryDefault :: (Arbitrary a, Unfoldable t) => Gen (t a)-arbitraryDefault = MkGen $ \r n -> let Arb _ f = unfold arbUnit in - fromMaybe (error "Failed to generate a value.") (f r (n + 1))+arbitraryDefault = let Arb _ gen = unfold arbUnit in + fromMaybe (error "Failed to generate a value.") <$> sized (\n -> resize (n + 1) gen) instance Unfoldable [] where unfold fa = choose
src/Data/Unfolder.hs view
@@ -77,8 +77,7 @@ import Control.Monad.Trans.Writer import qualified System.Random as R-import Test.QuickCheck.Arbitrary (Arbitrary(..))-import Test.QuickCheck.Gen (Gen(..))+import Test.QuickCheck (Arbitrary(..), Gen, oneof, elements, sized, resize) import Data.Monoid (Monoid(..)) import Data.Maybe (catMaybes, listToMaybe)@@ -334,37 +333,35 @@ -- | A variant of Test.QuickCheck.Gen, with failure -- and a count of the number of recursive positions.-data Arb a = Arb Int (R.StdGen -> Int -> Maybe a)+data Arb a = Arb Int (Gen (Maybe a)) instance Functor Arb where- fmap f (Arb i g) = Arb i $ fmap (fmap (fmap f)) g+ fmap f (Arb i g) = Arb i $ fmap (fmap f) g instance Applicative Arb where- pure = Arb 0 . pure . pure . pure- Arb i1 ff <*> Arb i2 fx = Arb (i1 + i2) $- \r -> let (r1, r2) = R.split r in liftA2 (<*>) (ff r1) (fx r2)+ pure = Arb 0 . pure . pure+ Arb i1 ff <*> Arb i2 fx = Arb (i1 + i2) $ liftA2 (<*>) ff fx instance Alternative Arb where- empty = Arb 0 (\_ _ -> Nothing)- Arb ia fa <|> Arb ib fb = Arb ((ia + ib + 1) `div` 2) $- \r n -> let (r1, r2) = R.split r in flattenArb r1 [fa r2 n, fb r2 n]+ empty = Arb 0 (pure Nothing)+ Arb ia fa <|> Arb ib fb = Arb ((ia + ib + 1) `div` 2) $ oneof [fa, fb] -- | Limit the depth of the generated data structure by -- dividing the given size by the number of recursive positions. instance Unfolder Arb where- choose ms = Arb 1 g+ choose ms = Arb 1 $ sized g where- g _ 0 = Nothing- g r n = let (r1, r2) = R.split r in - flattenArb r1 $ map (\(Arb i f) -> f r2 (n `div` max i 1)) ms+ g 0 = pure Nothing+ g n = flattenArb $ map (\(Arb i gen) -> resize (n `div` max i 1) gen) ms -flattenArb :: R.StdGen -> [Maybe a] -> Maybe a-flattenArb r ms = case catMaybes ms of- [] -> Nothing- ms' -> Just $ ms' !! fst (R.randomR (0, length ms' - 1) r)+flattenArb :: [Gen (Maybe a)] -> Gen (Maybe a)+flattenArb = go [] where+ go [] [] = pure Nothing+ go as [] = Just <$> elements as+ go as (g:gs) = g >>= \ma -> go (maybe as (:as) ma) gs arbUnit :: Arbitrary a => Arb a-arbUnit = Arb 0 (\r n -> Just $ unGen arbitrary r n)+arbUnit = Arb 0 (Just <$> arbitrary) -- | Variant of 'Data.Functor.Constant' that does multiplication of the constants for @\<*>@ and addition for @\<|>@. newtype NumConst a x = NumConst { getNumConst :: a } deriving (Eq, Show)
unfoldable.cabal view
@@ -1,5 +1,5 @@ Name: unfoldable-Version: 0.7.2+Version: 0.8 Synopsis: Class of data structures that can be unfolded. Description: Just as there's a Foldable class, there should also be an Unfoldable class. .@@ -38,7 +38,7 @@ base >= 4 && < 5 , transformers >= 0.3 && < 0.4 , random >= 1.0 && < 1.1- , QuickCheck >= 2.4 && < 2.8+ , QuickCheck >= 2.7.3 && < 2.8 if impl(ghc >= 7.6) cpp-options: -DGENERICS