packages feed

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 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