Îõ³h$$u‹      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰ŠSafe>À  smallcheck$An explanation for the test outcome.  ‹5Safeß smallcheck is a ŒÄ action that enumerates values of a certain type, up to some depth."The depth bound is tracked in the # monad and can be extracted using  and changed using .9To manipulate series at the lowest level you can use its , Ž and Œß instances. This module provides some higher-level combinators which simplify creating series. A proper 7 should be monotonic with respect to the depth ”@ i.e.  (+1) s! should emit all the values that s! emits (and possibly some more).ÛIt is also desirable that values of smaller depth come before the values of greater depth. smallcheck'Maximum depth of generated test values.ÄFor data values, it is the depth of nested constructor applications.ÞFor functional values, it is both the depth of nested case analysis and the depth of results.(c) Colin Runciman et al.BSD3"Roman Cheplyaka Safe5679>?ÀÁÂÔÖ×Ù~ smallcheck xs guarantees that xs is not null. smallcheck x guarantees that  x \ne 0 . smallcheck x guarantees that  x \ge 0 . smallcheck x guarantees that  x > 0 . smallcheck A proper £ implementation should pass the depth unchanged to its first argument. Doing otherwise will make enumeration of curried functions non-uniform in their arguments." smallcheckÛA simple series specified by a function from depth to the list of values up to that depth.# smallcheckLimit a  to its first n elements.$ smallcheck8Given a depth, return the list of values generated by a  instance.-For example, list all integers up to depth 1: +listSeries 1 :: [Int] -- returns [0,1,-1]% smallcheck)Return the list of values generated by a . Useful for debugging  instances. Examples: % 3  :: [‘0] -- returns [0,1,-1,2,-2,3,-3] % 3 ( ::    ‘ ) -- returns [0,1,-1,2,-2,3,-3] % 2  :: [[’!]] -- returns [[],[“],[”]]ÊThe first two are equivalent. The second has a more explicit type binding.& smallcheckMonadic version of %.' smallcheckSum (union) of series.( smallcheckProduct of series) smallcheckFair version of   and •.* smallcheckQuery the current depth.+ smallcheck#Run a series with a modified depth., smallcheckRun a  with the depth decreased by 1.:If the current depth is less or equal to 0, the result is –.- smallcheck - = — ˜. smallcheckóFix the depth of a series at the current level. The resulting series will no longer depend on the "ambient" depth./ smallcheckøIf the current depth is 0, evaluate the first argument. Otherwise, evaluate the second argument with decremented depth.2 smallcheckSame as 1, but preserves the depth.? smallcheckSame as 9, but preserves the depth.3 !"#$%&'()*+,-./0123456789:;<=>?30134567289:;<=>? !'()+,*"#$%&./-'7(8)4 (c) Colin Runciman et al.BSD3"Roman Cheplyaka Safe 3>ÀÁÂÉ×Ùû ú smallcheckñClass of tests that can be run in a monad. For pure tests, it is recommended to keep their types polymorphic in m! rather than specialising it to  .ÿ smallcheck&The type of properties over the monad m.€ smallcheck€ s $ \x -> p x makes x range over the  s, (by default, all variables range over the  for their types).„Note that, unlike the quantification operators, this affects only the variable following the operator and not subsequent variables.€, does not affect the quantification context. smallcheckExecute a monadic test.‚ smallcheck)Set the universal quantification context.ƒ smallcheck+Set the existential quantification context.„ smallcheck*Set the uniqueness quantification context.Bear in mind that  \exists! x, y\colon p\, x \, y  is not the same as 1 \exists! x \colon \exists! y \colon p \, x \, y . For example, / \exists! x \colon \exists! y \colon |x| = |y|  is true (it holds only when x=y=0), but  \exists! x, y \colon |x| = |y| ' is false (there are many such pairs).!As is customary in mathematics, „ $ \x y -> p x y is equivalent to „ $ \(x, y) -> p x y and not to „ $ \x -> „ $ \y -> p x y (the latter, of course, may be explicitly written when desired).íThat is, all the variables affected by the same uniqueness context are quantified simultaneously as a tuple.… smallcheckThe …” operator can be used to express a restricting condition under which a property should hold. It corresponds to implication in the classical logic. Note that …Ð resets the quantification context for its operands to the default (universal).† smallcheckÖRun property with a modified depth. Affects all quantified variables in the property.‡ smallcheck*Quantify the function's argument over its Æ, but adjust the depth. This doesn't affect any subsequent variables.™ smallcheckWorks like the ’5 instance, but includes an explanation of the result.š and ›6 correspond to test failure and success respectively. úûüýþÿœ€‚ƒ„…†‡…0(c) Colin Runciman et al.BSD3"Roman Cheplyaka Safe?Oˆ smallcheck*A simple driver that runs the test in the  monad and prints the results.‰ smallcheck Use this if:1You need to run a test in a monad different from ;You need to analyse the results rather than just print themŠ smallcheckLike ‰Ò, but allows to specify a monadic hook that gets executed after each test is run.ÎUseful for applications that want to report progress information to the user. ûüýþˆ‰Šˆ‰Šû  üýþ(c) Colin Runciman et al.BSD3"Roman Cheplyaka Safeå úûÿ€‚ƒ„…†‡ˆ‚ƒ„€…†‡ˆúûÿ ž  !!"##$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ€‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž  ‘’“” •–—˜–—™š›œ›œž›œŸ›œ –—¡–—¢–—£–—¤ ¥–¦§–¦¨ ©›œª«'smallcheck-1.2.1-BpNykyNqUom4xCilcMqlfLTest.SmallCheck.SeriesTest.SmallCheck.DriversTest.SmallCheckTest.SmallCheck.Property.ResultTest.SmallCheck.SeriesMonadgetDepth localDepth Data.FunctorIdentityControl.ApplicativeapTest.SmallCheck.Property%logict-0.7.0.3-FcvfohOp4iB4I8IocnJDkNControl.Monad.Logic.Class>>-PropertyFailureNotExist AtLeastTwoCounterExample PropertyFalsePropertySuccessExist ExistUnique PropertyTrue VacuouslyReasonArgument ppFailureSeriesDepthNonEmpty getNonEmptyNonZero getNonZero NonNegativegetNonNegativePositive getPositiveCoSerialcoseriesSerialseries genericSeriesgenericCoseriesgeneratelimit listSerieslistlistM\/><<~>decDepthconstMfixDepthdecDepthCheckedcons0cons1 newtypeConscons2cons3cons4cons5cons6alts0alts1alts2alts3alts4alts5alts6 newtypeAlts $fGSerialmM1 $fGSerialm:+: $fGSerialm:*: $fGSerialmV1 $fGSerialmU1 $fGSerialmM10$fSerialmCSUSeconds$fSerialmCUSeconds$fSerialmCTime$fSerialmCClock$fSerialmCUIntMax$fSerialmCIntMax$fSerialmCUIntPtr$fSerialmCIntPtr$fSerialmCULLong$fSerialmCLLong$fSerialmCSigAtomic$fSerialmCWchar$fSerialmCSize$fSerialmCPtrdiff$fSerialmCULong$fSerialmCLong$fSerialmCUInt $fSerialmCInt$fSerialmCUShort$fSerialmCShort$fSerialmCUChar$fSerialmCSChar$fSerialmCChar$fSerialmCBool$fSerialmCDouble$fSerialmCFloat$fSerialmCompose$fShow-> $fSerialmVoid$fSerialmComplex$fSerialmNonEmpty $fSerialm[]$fSerialmEither$fSerialmMaybe$fSerialmOrdering $fSerialmBool$fSerialm(,,,,,)$fSerialm(,,,,)$fSerialm(,,,) $fSerialm(,,) $fSerialm(,) $fSerialmChar$fSerialmDouble$fSerialmFloat $fSerialm() $fGSerialmK1$fGCoSerialm:+:$fGCoSerialm:*:$fGCoSerialmV1$fGCoSerialmU1$fGCoSerialmM1$fCoSerialmCSUSeconds$fCoSerialmCUSeconds$fCoSerialmCTime$fCoSerialmCClock$fCoSerialmCUIntMax$fCoSerialmCIntMax$fCoSerialmCUIntPtr$fCoSerialmCIntPtr$fCoSerialmCULLong$fCoSerialmCLLong$fCoSerialmCSigAtomic$fCoSerialmCWchar$fCoSerialmCSize$fCoSerialmCPtrdiff$fCoSerialmCULong$fCoSerialmCLong$fCoSerialmCUInt$fCoSerialmCInt$fCoSerialmCUShort$fCoSerialmCShort$fCoSerialmCUChar$fCoSerialmCSChar$fCoSerialmCChar$fCoSerialmCBool$fCoSerialmCDouble$fCoSerialmCFloat$fCoSerialmCompose $fCoSerialm-> $fSerialm->$fCoSerialmVoid$fCoSerialmComplex$fCoSerialmNonEmpty $fCoSerialm[]$fCoSerialmEither$fCoSerialmMaybe$fCoSerialmOrdering$fCoSerialmBool$fCoSerialm(,,,,,)$fCoSerialm(,,,,)$fCoSerialm(,,,)$fCoSerialm(,,)$fCoSerialm(,)$fCoSerialmRatio$fCoSerialmDouble$fCoSerialmFloat $fCoSerialm()$fGCoSerialmK1$fCoSerialmChar $fCoSerialmN $fSerialmN $fIntegralN$fNumN$fEnumN$fRealN$fCoSerialmWord64$fSerialmWord64$fCoSerialmWord32$fSerialmWord32$fCoSerialmWord16$fSerialmWord16$fCoSerialmWord8$fSerialmWord8$fCoSerialmWord $fSerialmWord$fCoSerialmNatural$fSerialmNatural $fCoSerialmM $fSerialmM $fIntegralM$fNumM$fEnumM$fRealM$fCoSerialmInt64$fSerialmInt64$fCoSerialmInt32$fSerialmInt32$fCoSerialmInt16$fSerialmInt16$fCoSerialmInt8 $fSerialmInt8$fCoSerialmInt $fSerialmInt$fCoSerialmInteger$fSerialmInteger$fShowPositive$fSerialmPositive$fIntegralPositive $fNumPositive$fEnumPositive$fBoundedPositive$fRealPositive$fSerialmRatio$fShowNonNegative$fSerialmNonNegative$fIntegralNonNegative$fNumNonNegative$fEnumNonNegative$fBoundedNonNegative$fRealNonNegative $fShowNonZero$fSerialmNonZero$fIntegralNonZero $fNumNonZero $fEnumNonZero$fBoundedNonZero $fRealNonZero$fShowNonEmpty$fSerialmNonEmpty0 $fEqNonZero $fOrdNonZero$fFunctorNonZero$fFoldableNonZero$fTraversableNonZero$fEqNonNegative$fOrdNonNegative$fFunctorNonNegative$fFoldableNonNegative$fTraversableNonNegative $fEqPositive $fOrdPositive$fFunctorPositive$fFoldablePositive$fTraversablePositive$fEqM$fOrdM$fShowM$fEqN$fOrdN$fShowNTestabletest TestQualityGoodTestBadTestPropertyovermonadicforAllexists existsUnique==> changeDepth changeDepth1 smallCheck smallCheckMsmallCheckWithHook MonadLogicbaseGHC.BaseMonad MonadPlus runSeriesghc-prim GHC.TypesIntBoolTrueFalse<*>emptyliftMconst$fTestablemEither Data.EitherLeftRight runPropertyIO