packages feed

stream-fusion 0.1.2.3 → 0.1.2.4

raw patch · 45 files changed

+16/−15330 lines, 45 filesdep ~basenew-uploaderPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- Control.Monad.Stream: class Functor f :: (* -> *)
+ Control.Monad.Stream: class Functor (f :: * -> *)
- Control.Monad.Stream: class Monad m :: (* -> *)
+ Control.Monad.Stream: class Monad (m :: * -> *)
- Data.Stream: Stream :: !s -> Step a s -> !s -> Stream a
+ Data.Stream: Stream :: !(s -> Step a s) -> !s -> Stream a

Files

− GHC_BUILD
@@ -1,113 +0,0 @@---            Build instructions for nobench + ghc with stream fusion-            ----------------------------------------------------------* Grab a current ghc tree (we have a local cache):--    $ scp -r /home/chakcvs/darcs/streams/ghc .--* Install our base fork into the tree:--    $ cd ghc/libraries--    $ darcs get /home/chakcvs/darcs/streams/base-    Copying patch 1730 of 1730... done!-    Finished getting.--    $ cd ../..--* Build as normal--    $ cat /home/dons/streams/build.mk -    SRC_HC_OPTS     = -H64m -O -fasm-    GhcStage1HcOpts = -O -fasm-    GhcStage2HcOpts = -O2 -fasm-    GhcLibHcOpts    = -O2 -fasm-    GhcLibWays      =-    SplitObjs       = NO--    $ cp /home/dons/streams/build.mk ./mk/--    $ autoreconf-    $ ./configure-    $ make -j2--* Get nobench:--    $ cd /tmp/-    $ darcs get http://www.cse.unsw.edu.au/~dons/code/nobench-    $ cd nobench  -    $ make boot--    Note the report generator needs the xhtml package.--* Edit the config files:--    Just needs to point to the in-place GHC, and for ghc-old to be-    your most recent non-stream ghc. Edit header.mk to have:--        COMPILERS   = ghc ghc-old --        GHC         = /home/dons/streams/build/compiler/stage2/ghc-inplace-        GHC_OLD     = ghc-6.7.20070224--        GHC_OPTS     = -Rghc-timing -O2 -fasm -fliberate-case-threshold100 -fdicts-cheap -fno-method-sharing -ddump-simpl-stats--* Run a test:-    -    $ cd spectral/calendar -    $ make--    Test: calendar (Bird and Wadlers calendar program)-    http://www.cse.unsw.edu.au/~dons/code/nobench//calendar-    ghc                  3.79    seconds            (1.0 x)-    ghc-old              3.91    seconds            (1.0 x)--* Run just the ghc test:--    $ env ONLY=ghc make just-    Updating results database with 1 new entries.--    Test: calendar (Bird and Wadlers calendar program)-    http://www.cse.unsw.edu.au/~dons/code/nobench/spectral/calendar-    ghc                  3.84    seconds            (1.0 x)-    ghc-old              3.91    seconds            (1.0 x)--Compilation logs are kept in the 'ghc.compile' and 'ghc-old.compile' files.-You can also just run the tests by hand:--    $ /home/dons/streams/build/compiler/stage2/ghc-inplace -no-recomp-    -Rghc-timing -O2 -fasm -fliberate-case-threshold100 -fdicts-cheap-    -fno-method-sharing -ddump-simpl-stats  --make -o calendar-    calendar.hs-    [1 of 1] Compiling Main             ( calendar.hs, calendar.o )--    4 SC:$wloop_length0-    6 SC:$wloop_length1-    9 SC:$wloop_length2-    2 SC:$wloop_length3-    3 SC:$wunfold_unstream6-    2 SC:$wunfold_unstream7-    2 SC:$wunfold_unstream8-    19 SC:unfold_unstream0-    17 SC:unfold_unstream1-    2 SC:unfold_unstream10-    18 SC:unfold_unstream2-    6 SC:unfold_unstream3-    2 SC:unfold_unstream5-    6 SC:unfold_unstream8-    2 SC:unfold_unstream9-    18 STREAM stream/unstream fusion--    ...--To run a whole class of tests, cd into the directory and type 'make':--    cd spectral-    make--make at the top level runs everything.---- Don-
− README
@@ -1,33 +0,0 @@-                          Stream fusible lists--Faster lists using stream fusion.--The abstract from the paper:--    This paper presents an automatic deforestation system, \emph{stream-    fusion}, based on equational transformations, that fuses a wider-    range of functions than existing short-cut fusion systems. In-    particular, stream fusion is able to fuse zips, left folds and-    functions over nested lists, including list comprehensions. A-    distinguishing feature of the framework is its simplicity: by-    transforming list functions to expose their structure, intermediate-    values are eliminated by general purpose compiler optimisations.--    We have reimplemented the Haskell standard List library on top of-    our framework, providing stream fusion for Haskell lists. By-    allowing a wider range of functions to fuse, we see an increase in-    the number of occurrences of fusion in typical Haskell programs. We-    present benchmarks documenting time and space improvements.--Building:--  $ runhaskell Setup.lhs configure --prefix=/home/dons-  $ runhaskell Setup.lhs build-  $ runhaskell Setup.lhs install--Use:--  import Data.List.Stream--and use as you would for normal lists.-Compile with ghc -O2 for best results.
− TODO
@@ -1,170 +0,0 @@--Functions that don't yet fuse:--    transpose   :: [[a]] -> [[a]]-    partition    :: (a -> Bool) -> [a] -> ([a], [a])--*   scanr       :: (a -> b -> b) -> b -> [a] -> [b]-*   scanr1      :: (a -> a -> a) -> [a] -> [a]--*?  mapAccumL   :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])-*?  mapAccumR   :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])-    span        :: (a -> Bool) -> [a] -> ([a], [a])-    inits       :: [a] -> [[a]]-    tails       :: [a] -> [[a]]-    isSuffixOf  :: Eq a => [a] -> [a] -> Bool-*   isInfixOf   :: Eq a => [a] -> [a] -> Bool--    words        :: String -> [String]-    unwords      :: [String] -> String--*   nub          :: Eq a => [a] -> [a]-*   delete       :: Eq a => a -> [a] -> [a]--*   nubBy        :: (a -> a -> Bool) -> [a] -> [a]-*   deleteBy     :: (a -> a -> Bool) -> a -> [a] -> [a]--    sort         :: Ord a => [a] -> [a]-    union        :: Eq a => [a] -> [a] -> [a]-    intersect    :: Eq a => [a] -> [a] -> [a]-    group        :: Eq a => [a] -> [[a]]--    unionBy      :: (a -> a -> Bool) -> [a] -> [a] -> [a]-    groupBy      :: (a -> a -> Bool) -> [a] -> [[a]]-    intersectBy  :: (a -> a -> Bool) -> [a] -> [a] -> [a]-    sortBy---Internal GHC:--    * List comprehensions desugaring--Think about scanl:--    "scanl -> fusible"  [~1] forall f z xs.-        scanl f z xs = unstream (Stream.scanl f z (stream (xs ++ [bottom])))----------------------------------------------------------------------------Ideas at the Warren View, Sun Mar 18 19:37:09 EST 2007--    * SPECCONSTR pragma (sent to spj)--    * rules with strictness annotations:-            - pick between foldl foldl' based on strictness info--    * rules matching on constraints:-            - so pick representation types for rules, e.g.-                     * bucketsort for Word8-                     * IntMap/Map for nub on Ord--    * undefineds in QuickCheck-----------------------------------------------------------------------------TODO:--    * strict on any state we control.-    * strict pairs expose constructors to SpecConstr, removing redundant-      arguments.---- DeepSeq context on existentials.--- All external values that are used in state, wrapped in Lazy--- State strict by default.---- add test case for bottom streams.----------------------------------------------------------------------------instance (Eq a) => Eq [a] -- Defined in GHC.Base-instance Functor [] -- Defined in GHC.Base-instance (Ord a) => Ord [a] -- Defined in GHC.Base--Enum-list comprehension desugaring----------------------------------------------------------------------------Queries about the H98 List spec:--* intersperse (and therefore intercalate) are too strict.--* unwords is too strict.--* (genericTake :: Int -> [a] -> [a]) /= take-    perhaps it should. In particular:--    genericTake _|_ [] = []-           take _|_ [] = _|_--    genericTake 0 _|_ = _|_-           take 0 _|_ = []--    genericTake (-1) xs = _|_-           take (-1) xs = []--  It looks like the Spec is wrong here, genericTake is inconsistent-  with take, genericDrop and genericSplitAt it has the initial clauses-  this way round:-    genericTake _ []        =  []-    genericTake 0 _         =  []-  when they should be the other way around, as they are for the other-  functions.--* Data.List.partition is too strict or perhaps the spec is too lazy-    H98 says: partition p _|_ = (_|_, _|_)-    Data.List.partition p _|_ = _|_--* Data.List.splitAt is too strict or perhaps the spec is too lazy-    H98 says: splitAt _|_ _|_ = (_|_, _|_)-    Data.List.splitAt _|_ _|_ = _|_----------------------------------------------------------------------------If we had strictness info available in rules we could say:--forall (f :: [[Char!]] -> b) xs. f (lines xs) = f (stricterLines xs)-erm that is if we're consuming lines an consuming each string in a-spine-strict way then we can use a more efficient lines implementation.-Same goes for words.--Note how you can't easily talk about structural strictness properties by-putting annotations on types since that structure isn't fully exposed in-the type.----------------------------------------------------------------------------More stuff to stick in the paper:--Limits on fusion. We conjecture that whenever an implementation relies-on sharing that it's realy not fusible, or when you 'fuse' it anyway you-get no performance advantage since it has to allocate internally anyway.-The best that could be done is if in the internal allocation used to get-sharing is more eficient. Eg with sort we might use a heap as the internal-state and stream into it and out of it.--What does build/foldr do about sharing?--* Binary sizes, fusion opportunties v foldr/build--* Currently list comprehensions compile to build/foldr stuff.-  -- this hurts us, since that no longer fuses. We could keep-  build/foldr fusion for list comprehensions I guess?- -- e.g. paraffins----------------------------------------------------------------------------* imaginary/wheel_sieve1 : looks like a missing list comprehension fuse.--* spectral/atom:             some list comprehensions./e--* calendar: a lot of fusion here. should be faster.-    Still L constructors being left behind.--* circsim, same story. Either's being left behind.--* k-nucleotide, some different loops being generated.--* primes,     9 foldr/app-* sorting, some list comprehensions
− desugar/Desugar.hs
@@ -1,399 +0,0 @@--- Use like so:------ runghc Desugar.hs < Examples.hs > ExamplesDesugared.hs------ and watch out, the pretty printer sometimes misses (..)'s (wtf!!!)--module Main (main) where--import Data.List--import Language.Haskell.Parser-import Language.Haskell.Syntax-import Language.Haskell.Pretty--main = interact $ \input ->-  let ParseOk (HsModule sl m es is decls) = parseModule input-      decls' = [ decl-               | (exp, stmts, context) <- extractListComps decls-               , let exp' = desugar [0..] exp stmts-               , decl <- [context (HsListComp exp stmts), context exp'] ]-   in prettyPrint (HsModule sl m es is decls') ++ "\n"--extractListComps :: [HsDecl] -> [(HsExp, [HsStmt], HsExp -> HsDecl)]-extractListComps decls =-    [ (exp, stmts,-       \rhs -> HsPatBind sl (HsPVar (HsIdent name))-                            (HsUnGuardedRhs rhs) [])-    | HsPatBind sl (HsPVar (HsIdent name))-                   (HsUnGuardedRhs (HsListComp exp stmts)) [] <- decls ]- ++ [ (exp, stmts,-       \rhs -> HsFunBind [HsMatch sl name ps (HsUnGuardedRhs rhs) ds])-    | HsFunBind [HsMatch sl name ps-                         (HsUnGuardedRhs (HsListComp exp stmts)) ds] <- decls ]--{---Streams desugaring for list comprehensions:--<< [ e | Q ] >>---<< [ e | ] >> = return e--<< [ e | b, Q ] >> = gaurd b (<< [ e |  Q ] >>)--<< [ e | p <- l, Q ] >> = bind f g l-  where-    f p = Just (x1, ..., xn)-    f _ = Nothing--    g (x1, ..., xn) = << [ e | Q ] >>--<< [ e | let decls, Q ] >> = declare g (let decls in (x1, .., xn))-  where-    g (x1, .., xn) = << [ e | Q ] >>--We can optimise the common cases:---<< [ e | p <- l, b ] >> = mapFilter f l-  where f p | b = Just e-        f _     = Nothing--<< [ e | p <- l, b, Q ] >> = bind f g l-  where f p | b = Just (x1, ..., xn)-        f _     = Nothing-        -        g (x1, ..., xn) = << [ e | Q ] >>---using the auxillary definitions:--List:--------return e = [e]--guard True  xs = xs-guard false xs = []--concatMap' f g xs = foldr h [] xs-  where h x ys = case f x of-                  Just bs -> g bs ++ ys-                  Nothing ->         ys--declare g bs = g bs--mapFilter f xs = foldr h [] xs-  where h x ys = case f x of-                  Just y  -> y : ys-                  Nothing ->     ys---Stream:----------return e = Stream next True-  where-    next True  = Yield e False-    next False = Done--guard b (Stream next0 s0) = Stream next (b, s0)-  where-    next (False, s) = Done-    next (True, s)  = case next0 s of-      Done       -> Done-      Skip    s' -> Skip    (True, s')-      Yield x s' -> Yield x (True, s')--bind f g (Stream next0 s0) = Stream next (s, Nothing)-  where-    next (s, Nothing) = case next0 s of-      Done       -> Done-      Skip    s' -> Skip    (s', Nothing)-      Yield x s' -> case f x of-         Just bs -> Skip (s', Just (g bs))-         Nothing -> Skip (s', Nothing)--    next (s, Just (Stream next1 s1)) = case next1 s1 of-      Done        -> Done-      Skip    s1' -> Skip    (s, Just (Stream next1 s1'))-      Yield x s1' -> Yield x (s, Just (Stream next1 s1'))--declare g bs = Stream next (g bs)-  where next (Stream next0 s) = case next0 s of-      Done       -> Done-      Skip    s' -> Skip    (Stream next0 s')-      Yield x s' -> Yield x (Stream next0 s')--mapFilter f (Stream next0 s0) = Stream next s0-  where-    next s = case next0 s of-      Done       -> Done-      Skip    s' -> Skip    s'-      Yield x s' -> case f x of-                  Just y  -> Yield y s'-                  Nothing -> Skip    s'---}--hsJust       = HsVar (UnQual (HsIdent "Just"))-hsNothing    = HsVar (UnQual (HsIdent "Nothing"))--hsReturn     = HsVar (Qual (Module "L") (HsIdent "return"))-hsGuard      = HsVar (Qual (Module "L") (HsIdent "guard"))-hsConcatMap  = HsVar (Qual (Module "L") (HsIdent "concatMap"))-hsConcatMap' = HsVar (Qual (Module "L") (HsIdent "concatMap'"))-hsDeclare    = HsVar (Qual (Module "L") (HsIdent "declare"))-hsMapFilter  = HsVar (Qual (Module "L") (HsIdent "mapFilter"))-hsMap        = HsVar (Qual (Module "L") (HsIdent "map"))--desugar :: [Int] -> HsExp -> [HsStmt] -> HsExp---- [ e | ] = return e-desugar ns e [] = HsApp hsReturn e---- [ e | b, Q ] = gaurd b [ e | Q ]-desugar ns e (HsQualifier b : qs) = HsApp (HsApp hsGuard b)-                                           (HsParen (desugar ns e qs))---- special case: final generator for simple irrefutable pattern p--- [ e | p <- l ] = let f p = e---                   in map f l-desugar (n:ns) e (HsGenerator sloc p@(HsPVar _) l : []) =-  HsLet [HsFunBind [HsMatch sloc (HsIdent (f n)) [p]-                   {- = -} (HsUnGuardedRhs e) []-                   ]-        ]-        (HsApp (HsApp hsMap (HsVar (UnQual (HsIdent (f n)))))-               (HsParen l))---- special case: final generator--- [ e | p <- l ] = let f p = Just e---                      f _ = Nothing---                   in mapFilter f l-desugar (n:ns) e (HsGenerator sloc p l : []) =-  HsLet [HsFunBind [HsMatch sloc (HsIdent (f n)) [p]-                   {- = -} (HsUnGuardedRhs (HsApp hsJust e)) []-                   ,HsMatch sloc (HsIdent (f n)) [HsPWildCard]-                   {- = -} (HsUnGuardedRhs hsNothing)       []-                   ]-        ]-        (HsApp (HsApp hsMapFilter (HsVar (UnQual (HsIdent (f n)))))-               (HsParen l))---- special case: final generator with trailing condition--- [ e | p <- l, b ] = let f p | b = Just e---                         f _     = Nothing---                      in mapFilter f l-desugar (n:ns) e (HsGenerator sloc p l : HsQualifier b : []) =-  HsLet [HsFunBind [HsMatch sloc (HsIdent (f n)) [p]-                   {- = -} (HsGuardedRhss [HsGuardedRhs sloc b-                                           (HsApp hsJust e)]) []-                   ,HsMatch sloc (HsIdent (f n)) [HsPWildCard]-                   {- = -} (HsUnGuardedRhs hsNothing) []-                   ]-        ]-        (HsApp (HsApp hsMapFilter (HsVar (UnQual (HsIdent (f n)))))-               (HsParen l))---- special case: generator with trailing condition--- [ e | p <- l, b, Q ] = let f p | b = Just (x1, ..., xn)---                            f _ = Nothing---                            g (x1, ..., xn) = [ e | Q ]---                         in concatMap' f g l-desugar (n:ns) e (HsGenerator sloc p l : HsQualifier b : qs) =-  let xs = patBinders p-           `intersect` stmtsFV e qs -- optimisation: only bind used vars-   in HsLet [HsFunBind [HsMatch sloc (HsIdent (f n)) [p]-                       {- = -} (HsGuardedRhss-                                 [HsGuardedRhs sloc b-                                 (HsApp hsJust (mkTupleExpr xs))]) []-                       ,HsMatch sloc (HsIdent (f n)) [HsPWildCard]-                       {- = -} (HsUnGuardedRhs hsNothing) []-                       ]-            ,HsFunBind [HsMatch sloc (HsIdent (g n)) [mkTuplePat xs]-                       {- = -} (HsUnGuardedRhs (desugar ns e qs)) []-                       ]-            ]-            (HsApp (HsApp (HsApp hsConcatMap'-                                 (HsVar (UnQual (HsIdent (f n)))))-                          (HsVar (UnQual (HsIdent (g n)))))-                   (HsParen l))----- special case: for simple irrefutable pattern p--- [ e | p <- l, Q ] = let g p = [ e | Q ]---                      in concatMap g l-desugar (n:ns) e (HsGenerator sloc p@(HsPVar _) l : qs) =-  HsLet [HsFunBind [HsMatch sloc (HsIdent (g n)) [p]-                   {- = -} (HsUnGuardedRhs (desugar ns e qs)) []-                   ]-        ]-        (HsApp (HsApp hsConcatMap (HsVar (UnQual (HsIdent (g n)))))-               (HsParen l))---- general case of a generator--- [ e | p <- l, Q ] = let f p = Just (x1, ..., xn)---                         f _ = Nothing---                         g (x1, ..., xn) = [ e | Q ]---                       in concatMap' f g l-desugar (n:ns) e (HsGenerator sloc p l : qs) =-  let xs = patBinders p -           `intersect` stmtsFV e qs -- optimisation: only bind used vars-   in HsLet [HsFunBind [HsMatch sloc (HsIdent (f n)) [p]-                       {- = -} (HsUnGuardedRhs-                                 (HsApp hsJust (mkTupleExpr xs))) []-                       ,HsMatch sloc (HsIdent (f n)) [HsPWildCard]-                       {- = -} (HsUnGuardedRhs hsNothing) []-                       ]-            ,HsFunBind [HsMatch sloc (HsIdent (g n)) [mkTuplePat xs]-                       {- = -} (HsUnGuardedRhs (desugar ns e qs)) []-                       ]-            ]-            (HsApp (HsApp hsConcatMap (HsVar (UnQual (HsIdent (g n)))))-                   (HsParen l))--{---- TODO: need to get binders in decls for this one:---- [ e | let decls, Q ] = let g (x1, .., xn) = [ e | Q ]---                         in declare g (let decls in (x1, .., xn))-desugar ns e (HsLetStmt decls : qs) =-  HsLet decls (desugar ns e qs)--}--patBinders :: HsPat -> [HsName]-patBinders (HsPVar name)         = [name]-patBinders (HsPLit _)            = []-patBinders (HsPNeg p)            = patBinders p-patBinders (HsPInfixApp p1 _ p2) = patBinders p1 ++ patBinders p2-patBinders (HsPApp _ ps)         = concatMap patBinders ps-patBinders (HsPTuple ps)         = concatMap patBinders ps-patBinders (HsPList ps)          = concatMap patBinders ps-patBinders (HsPParen p)          = patBinders p-patBinders (HsPRec _ fields)     = concat [ patBinders p-                                          | HsPFieldPat _ p <- fields ]-patBinders (HsPAsPat _ p)        = patBinders p-patBinders (HsPWildCard)         = []-patBinders (HsPIrrPat p)         = patBinders p----- The following is for an optimisation, perhaps it's unnecessary.--nameFV (Qual _ _)  = []-nameFV (UnQual n)  = [n]-nameFV (Special _) = []--qopFV (HsQVarOp n) = nameFV n-qopFV _            = []--expFV :: HsExp -> [HsName]-expFV (HsVar n) = nameFV n-expFV (HsCon _) = []-expFV (HsLit _) = []-expFV (HsInfixApp e1 op e2) = qopFV op ++ expFV e1 ++ expFV e2-expFV (HsApp e1 e2) = expFV e1 ++ expFV e2-expFV (HsNegApp e) = expFV e-expFV (HsLambda _ ps e) = nub (expFV e) \\ concatMap patBinders ps---expFV (HsLet [HsDecl] HsExp)-expFV (HsIf e1 e2 e3) = expFV e1 ++ expFV e2 ++ expFV e3---expFV (HsCase HsExp [HsAlt])-expFV (HsDo stmts) = stmtsFV unit_con stmts-expFV (HsTuple es) = concatMap expFV es-expFV (HsList es) = concatMap expFV es-expFV (HsParen e) = expFV e-expFV (HsLeftSection e op)  = qopFV op ++ expFV e-expFV (HsRightSection op e) = qopFV op ++ expFV e---expFV (HsRecConstr HsQName [HsFieldUpdate])	record construction expression---expFV (HsRecUpdate HsExp [HsFieldUpdate])	record update expression-expFV (HsEnumFrom e) = expFV e-expFV (HsEnumFromTo e1 e2) = expFV e1 ++ expFV e2-expFV (HsEnumFromThen e1 e2) = expFV e1 ++ expFV e2-expFV (HsEnumFromThenTo e1 e2 e3) = expFV e1 ++ expFV e2 ++ expFV e3-expFV (HsListComp e stmts) = stmtsFV e stmts-expFV (HsExpTypeSig _ e _) = expFV e--stmtsFV :: HsExp -> [HsStmt] -> [HsName]-stmtsFV e [] = expFV e-stmtsFV e (HsGenerator _ p e' : stmts) = nub (expFV e' ++ stmtsFV e stmts) \\ patBinders p-stmtsFV e (HsQualifier     e' : stmts) = expFV e' ++ stmtsFV e stmts---stmtsFV e (HsLetStmt decls) = --mkTupleExpr []  = HsCon (Special HsUnitCon)-mkTupleExpr [n] = HsVar (UnQual n)-mkTupleExpr ns  = HsTuple [ HsVar (UnQual n) | n <- ns ]--mkTuplePat []  = HsPWildCard-mkTuplePat [n] = HsPVar n-mkTuplePat ns  = HsPTuple [ HsPVar n | n <- ns ]--f n = "f_" ++ show n-g n = "g_" ++ show n-------------{---Alternative streams desugaring for list comprehensions:--<< [ e | Q ] P D >> :: Exp -> [Qual] -> (Pat -> Pat) -> Exp -> ([Clause], Exp)--Translation scheme takes the list comp's expression and list of qualifiers-and as extra args, a pattern (with a hole) that gives the state pattern and an-expression giving the state to return to when done. It returns a list of-clauses for a 'next' stepper function and an initialiser expression for the-stream's initial state.--To construct the top level we use:--[ e | Q ] = Stream (FunDef "next" clauses) init-  where (clauses, init) = << [ e | Q ] [.] Done >>---<< [ e | ] P D >> = (next:[], True)-  where-     next P[True]  = Yield e P[False]-     next P[False] = D---<< [ e | b, Q ] P D >> = (next:nexts, Nothing)-  where-     (nexts, init) = << [ e | Q ] P[Just[.]] D >>--     next P[Nothing] | b         = Skip (P[Just init])-                     | otherwise = D---<< [ e | let decls, Q ] P D >> = (next:nexts, Nothing)-  where-     (nexts, init) = << [ e | Q ] P[Just((x_n_0, , x_n_m) :!: [.])] D >>--     next P[Nothing] = Skip P[Just(let decls in (x_n_0, , x_n_m) :!: init)]-     -     {x_n_0, , x_n_m} = DV (decls) -- Defined variables---<< [ e | p <- l, Q ] P >> = (next:nexts, stream l :!: Nothing)-  where-     (nexts, init) = << [ e | Q ] P[(Stream next_n s_n :!: Just (p :!: [.]))]-                                  P[(Stream next_n s_n :!: Nothing)] >>--     next P[(Stream next_n s_n :!: Nothing)] = case next_n s_n of-       Done         -> D-       Skip    s_n' -> Skip P[(Stream next_n s_n' :!: Nothing)]-       Yield x s_n' -> case x of-                  p -> Skip P[(Stream next_n s_n' :!: Just (x :!: init))]-                  _ -> Skip P[(Stream next_n s_n' :!: Nothing)]---}
− desugar/Examples.hs
@@ -1,19 +0,0 @@-module Examples where--map :: (a -> b) -> [a] -> [b]-map f as = [ f a | a <- as ]--concat :: [[a]] -> [a]-concat ass = [ a | as <- ass, a <- as ]--concatMap :: (a -> [b]) -> [a] -> [b]-concatMap f as = [ b | a <- as, b <- f a ]--filter :: (a -> Bool) -> [a] -> [a]-filter p as = [ a | a <- as, p a ]--prod xs ys = [ x * y | x <- xs, y <- ys ]--foo xs ys = [ x * y | Left (x, _) <- xs, y <- ys ]--bar xs ys zs = [ x * y | x <- xs, y <- ys, z <- zs ]
− setup-base.sh
@@ -1,56 +0,0 @@-#!/bin/sh--# dump (and edit) the stream/list code into a copy of base-streams -# such that the whole thing builds.--#-# assumes we're in the 'list' main repo-#--ghc_base_path=$*-if [ -z "$ghc_base_path" ] ; then-    echo "usage: ./setup-base.sh path_to_base_package"-    exit 1-fi--# Where are we sending things?-echo -n "Preparing to set up streams stuff under: "-echo $ghc_base_path--# Just double check its a base repo:-echo -n "Checking it looks like a proper base repo .... "-if [ -d "$ghc_base_path/_darcs/patches" ] ; then-    looks_ok=True-else-    looks_ok=False-fi-echo $looks_ok--if [ "$looks_ok" = "False" ] ; then-    echo "'$ghc_base_path' doesn't look like a darcs repo!"-    exit 1-fi--# Work out if we need to create the Data/List subdir-echo -n "Checking if we need to create the Data/List subdir... "-ghc_base_streams="$ghc_base_path/Data/List"-if [ ! -d "$ghc_base_streams" ] ; then-    create_streams=True-else-    create_streams=False-fi-echo $create_streams--if [ "$create_streams" = "True" ] ; then-    mkdir $ghc_base_streams-fi--# copy first-echo "{-# OPTIONS_GHC -fno-implicit-prelude #-}" > $ghc_base_streams/Stream.hs-echo "{-# OPTIONS_GHC -fno-implicit-prelude #-}" > $ghc_base_path/Data/Stream.hs--cat Data/List/Stream.hs >> $ghc_base_streams/Stream.hs-cat Data/Stream.hs      >> $ghc_base_path/Data/Stream.hs---echo "done."
stream-fusion.cabal view
@@ -1,7 +1,7 @@ Name:                stream-fusion-Version:             0.1.2.3+Version:             0.1.2.4 Author:              Duncan Coutts, Don Stewart-Maintainer:          duncan.coutts@worc.ox.ac.uk, dons00@gmail.com+Maintainer:          none License:             BSD3 License-file:        LICENSE Synopsis:            Faster Haskell lists using stream fusion@@ -16,20 +16,26 @@         and hide list functions from the Prelude. Category:            Data Build-Type:          Simple-Build-Depends:       base >= 3 && < 5-Stability:           experimental+Cabal-Version:       >= 1.6 Tested-with:         GHC==7.0.3-Exposed-modules:     Data.Stream+Stability:           experimental++source-repository head+   type: darcs+   location: http://hub.darcs.net/shelarcy/stream-fusion++Library+  Build-Depends:     base >= 3 && < 5+  Exposed-modules:   Data.Stream                      Data.List.Stream                      Control.Monad.Stream-Extensions:          CPP, BangPatterns, ExistentialQuantification-cpp-options:         -DEXTERNAL_PACKAGE-ghc-options:         -fglasgow-exts-                     -Odph+  Extensions:        CPP, BangPatterns, ExistentialQuantification,+                     MagicHash, TypeOperators+  cpp-options:       -DEXTERNAL_PACKAGE+  ghc-options:       -Odph                      -fspec-constr                      -funbox-strict-fields                       -fdicts-cheap-                     -fno-method-sharing                      -fmax-simplifier-iterations10                      -fliberate-case-threshold100                      -Wall
− tests/Bench/Fusion.hs
@@ -1,151 +0,0 @@-{-# OPTIONS -cpp #-}------ Test the results of fusion---------- N.B. make sure to disable down fusion when using only loopU fusion-----import Data.Char-import Bench.Utils-import Text.Printf-import qualified Data.List.Stream as P -- ours---- minimum pipelines to trigger the various fusion forms-tests =- [("force0",          [F  (P.maximum)])- ,("force1",          [F  (P.map (+1))])---- non directional- ,("map/map",-    [F  (-        P.map (*2) . P.map (+4)                             -- 1-    )])- ,("filter/filter",-    [F  (-        P.filter (/=101) . P.filter (/=102)                 -- 1-    )])- ,("filter/map",-    [F  (-        P.filter (/=103) . P.map (+5)                       -- 1-    )])- ,("map/filter",-    [F  (-        P.map (*3) . P.filter (/=104)                       -- 1-    )])- ,("map/noacc",-    [F  (-        (P.map (+1) . P.filter (/=112)) . P.map (*2)         -- 2-    )])- ,("noacc/map",-    [F  (-        P.map (+1) . (P.map (+2) . P.filter (/=113))         -- 2-    )])- ,("filter/noacc",-    [F  (-        (P.map (+1) . P.filter (/=101)) . P.filter (/=114)   -- 2-    )])- ,("noacc/filter",-    [F  (-        P.filter (/=101) . (P.map (*2) . P.filter (/=115))  -- 2-    )])- ,("noacc/noacc",-    [F  (-        (P.map (*3) . P.filter (/=108)) . (P.map (*4) . P.filter (/=109)) -- 3-    )])---- up loops- ,("up/up",-    [F  (-        P.foldl' (const.(+1)) (0::X) . P.scanl (flip const) (0::W) -- 1-    )])- ,("map/up",-    [F  (-        P.foldl' (const.(+6)) (0::X) . P.map (*4) -- 1-    )])- ,("up/map",-    [F  (-        P.map (+7) . P.scanl const (0::W) -- 1-    )])- ,("filter/up",-    [F  (-        P.foldl' (const.(+8)) (0::X) . P.filter (/=105) -- 1-    )])- ,("up/filter",-    [F  (-        P.filter (/=106) . P.scanl (flip const) (0::W) -- 1-    )])- ,("noacc/up",-    [F  (-        P.foldl' (const.(+1)) (0::W) . (P.map (+1) . P.filter (/=110)) -- 2-    )])- ,("up/noacc",-    [F  (-        (P.map (+1) . P.filter (/=111)) . P.scanl (flip const) (0::W) -- 2-    )])---- down loops- ,("down/down",-    [F  (-        P.foldr (const (+9))  (0::W) . P.scanl (flip const) (0::W) -- 1-    )])- ,("map/down",-    [F  (-        P.foldr (const (+10)) (0::W) . P.map (*2) -- 1-    )]) - ,("down/map",-    [F  (-        P.map (*2) . P.scanl (flip const) (0::W) -- 1-    )])- ,("filter/down",-    [F  (-        P.foldr (const (+11)) (0::W) . P.filter (/=106) -- 1-    )])- ,("down/filter",-    [F  (-        P.filter (/=107) . P.scanl (flip const) (0::W) -- 1-    )])- ,("noacc/down",-    [F  (-        P.foldr (const (+1)) (0::W) . (P.map (+1) . P.filter (/=116)) -- 2-    )])- ,("down/noacc",-    [F  (-        (P.map (+1) . P.filter (/=101)) . P.scanl (flip const) (0::W) -- 2-    )])---- misc- ,("length/loop",-    [F  (-        P.length  . P.filter (/=105) -- 1-    )])- ,("maximum/loop",-    [F  (-        P.maximum . P.map (*4) -- 1-    )])- ,("minimum/loop",-    [F  (-        P.minimum . P.map (+6) -- 1-    )])-- ]---- and some longer ones to see the full effect-bigtests =- [("big map/map",-    [F  (P.map (subtract 3). P.map (+7) . P.map (*2) . P.map (+4) -- 3-    )])- ,("big filter/filter",-    [F  (P.filter (/=103) . P.filter (/=104) . P.filter (/=101) .  P.filter (/=102) -- 3-    )])- ,("big filter/map",-    [F  (P.map (*2) . P.filter (/=104) . P.map (+6) . P.filter (/=103) .  P.map (+5) --4 -    )])- ]--main = do-    force (string,string)-    printf "#Byte\n"-    run 5 (map (fromIntegral.ord) string) (tests ++ bigtests)-
− tests/Bench/ListVsBase.hs
@@ -1,416 +0,0 @@-{-# OPTIONS -fglasgow-exts #-}--- ^ unboxed strings------ Benchmark tool.--- Compare a function against equivalent code from other libraries for--- space and time.----import Bench.Utils--import qualified Data.List        as L -- theirs-import qualified Data.List.Stream as S -- ours --import Data.Char-import Data.Word-import Data.Int--import System.IO-import Control.Monad-import Text.Printf--main :: IO ()-main = do-    -- initialise-    let input = Input (take 1000 string) string string2 (splitEvery 1000 string2)-    force input--    putStrLn "Benchmarking Data.List.Stream <=> Data.List"-    putStrLn "===========================================\n"--    printf "# Size of test data: %dk\n" ((floor $ (fromIntegral (length string)) / 1024) :: Int)-    printf "#List\t List.Stream\n"---    run 5 input tests----------------------------------------------------------------------------tests =- [-    -- * Basic interface--    ("++",  -- should be identical-        [F ( app  (uncurry ((L.++) :: S -> S -> S) )    )-        ,F ( app  (uncurry ((S.++) :: S -> S -> S) )    ) ]-    )--    , ("head",-        [F ( app  (L.head :: S -> Char) )-        ,F ( app  (S.head :: S -> Char) )]-    )--    , ("last",-        [F (     app (L.last :: S -> Char))-        ,F (     app (S.last :: S -> Char))-    ])--    , ("init",-        [F (     app (L.init :: S -> S))-        ,F (     app (S.init :: S -> S))-    ])--    , ("null",-        [F (     app (L.null :: S -> Bool))-        ,F (     app (S.null :: S -> Bool))-    ])--    , ("length",-        [F (      app  (L.length :: S -> Int))-        ,F (      app  (S.length :: S -> Int))-    ])--    -- * List transformations-    , ("map",-        [F (      app ( L.map toUpper :: S -> S ))-        ,F (      app ( S.map toUpper :: S -> S ))-    ])--    , ("reverse",-        [F (     app (L.reverse :: S -> S ))-        ,F (     app (S.reverse :: S -> S ))-    ])--    , ("intersperse",-        [F ( app  (L.intersperse 'x' :: S -> S)     )-        ,F ( app  (S.intersperse 'x' :: S -> S)     ) ]-     )--    , ("intercalate",-        [F ( app2  (L.intercalate :: S -> [S] -> S)     )-        ,F ( app2  (S.intercalate :: S -> [S] -> S)     ) ]-     )--    -- transpose is too slow.--    -- * Reducing lists (folds)--    , ("foldl'",-        [F (     app  ( L.foldl' (\a _ -> a+1) 0 :: S -> Int  ) )-        ,F (     app  ( S.foldl' (\a _ -> a+1) 0  :: S -> Int ) )-    ])--{--    , ("foldr",-        [F (     app  ( L.foldr (\_ a -> a+1) 0 :: S -> Int  ) )-        ,F (     app  ( S.foldr (\_ a -> a+1) 0 :: S -> Int ) )-    ])--}--    -- ** Special folds--    , ("concat",-        [F ( app   ((\ss -> L.concat (ss++ss++ss)) :: [S] -> S)               )-        ,F ( app   ((\ss -> S.concat (ss++ss++ss)) :: [S] -> S)               ) ]-     )--    , ("concatMap",-        [F ( app   (L.concatMap (\c -> L.replicate 10 c) :: S -> S))-        ,F ( app   (S.concatMap (\c -> S.replicate 10 c) :: S -> S)) ]-     )--    , ("any",-        [F (     app ( L.any (=='x') :: S -> Bool       ))-        ,F (     app ( S.any (=='x') :: S -> Bool       ))-    ])-    , ("all",-        [F (     app ( L.all (=='x') :: S -> Bool       ))-        ,F (     app ( S.all (=='x') :: S -> Bool       ))-    ])-    , ("maximum",-        [{-F (     app (L.maximum :: S -> Char) )-        ,-}F (     app (S.maximum :: S -> Char) )-    ])-    , ("minimum",-        [{-F (     app (L.minimum :: S -> Char) )-        ,-}F (     app (S.minimum :: S -> Char) )-    ])--    -- * Building lists-    -- ** Scans--    -- * Sublists-    -- ** Extracting sublists-    , ("take",-        [F (     app ( L.take 100000 :: S -> S) )-        ,F (     app ( S.take 100000 :: S -> S) )-    ])-    , ("drop",-        [F (     app ( L.drop 100000 :: S -> S) )-        ,F (     app ( S.drop 100000 :: S -> S) )-    ])--    , ("takeWhile",-        [F (     app ( L.takeWhile (/='z') :: S -> S  ))-        ,F (    app  ( S.takeWhile (=='z')  :: S -> S ))-    ])-    , ("dropWhile",-        [F (     app ( L.dropWhile (/='z')  :: S -> S ) )-        ,F (    app  ( S.dropWhile (/='z')  :: S -> S ) )-    ])--    -- * Searching lists-    -- ** Searching by equality-    , ("elem",-        [F (     app (L.elem ('Z') :: S -> Bool) )-        ,F (     app (S.elem ('Z') :: S -> Bool) )-    ])-    , ("notElem",-        [F (     app (L.notElem ('Z') :: S -> Bool) )-        ,F (     app (S.notElem ('Z') :: S -> Bool) )-    ])--    -- ** Searching with a predicate--    , ("find",-        [F (     app (L.find (=='Z') :: S -> Maybe Char) )-        ,F (     app (S.find (=='Z') :: S -> Maybe Char) )-    ])--    , ("filter",-        [F (      app ( L.filter isSpace :: S -> S ))-        ,F (      app ( S.filter isSpace :: S -> S ))-    ])--    -- * Indexing lists--    , ("index",-        [F (      app ((\x -> x L.!! 300000) ::  S -> Char  ))-        ,F (      app ((\x -> x S.!! 300000) ::  S -> Char  ))-    ])--    , ("elemIndex",-        [F (    app (L.elemIndex ('Z') :: S -> Maybe Int ) )-        ,F (    app (S.elemIndex ('Z') :: S -> Maybe Int ) )-    ])--    , ("elemIndices",-        [F (    app (L.elemIndices ('Z') :: S -> [Int] ) )-        ,F (    app (S.elemIndices ('Z') :: S -> [Int] ) )-    ])--    , ("findIndex",-        [F (    app (L.findIndex (=='Z') :: S -> Maybe Int ) )-        ,F (    app (S.findIndex (=='Z') :: S -> Maybe Int ) )-    ])--    , ("findIndices",-        [F (    app (L.findIndices (=='Z') :: S -> [Int] ) )-        ,F (    app (S.findIndices (=='Z') :: S -> [Int] ) )-    ])--    -- * Zipping and unzipping lists--    , ("zip",-        [F (     app (uncurry (L.zip) :: (S,S) -> [(Char, Char)]     ))-        ,F (     app (uncurry (S.zip) :: (S,S) -> [(Char, Char)]     ))-    ])--    , ("zipWith",-        [F (     app (uncurry (L.zipWith (,)) :: (S,S) -> [(Char, Char)]     ))-        ,F (     app (uncurry (S.zipWith (,)) :: (S,S) -> [(Char, Char)]     ))-    ])--    , ("replicate",-        [F (    const $ L.replicate 2000000 'x')-        ,F (    const $ S.replicate 2000000 'x')-    ])-- ]---{----    , ("span",-        [F ({-# SCC "span"          #-}     app $ B.span (/=122))-        ,F ({-# SCC "lazy span"     #-}     app $ L.span (/=122))-    ])-    , ("break",-        [F ({-# SCC "break"         #-}     app $ B.break (==122))-        ,F ({-# SCC "lazy break"    #-}     app $ L.break (==122))-    ])-    , ("split",-        [F ({-# SCC "split"         #-}     app $ B.split 0x0a)-        ,F ({-# SCC "lazy split"    #-}     app $ L.split 0x0a)-    ])---  , ("breakByte",---      [F ({-# SCC "breakChar"     #-}     app $ B.breakByte 122)---      ,F ({-# SCC "lazy breakChar" #-}    app $ L.breakByte 122)---  ])---  , ("spanByte",---      [F ({-# SCC "spanChar"      #-}     app $ B.spanByte 122)---      ,F ({-# SCC "lazy spanChar" #-}     app $ L.spanByte 122)---  ])--    , ("cons",-        [F ({-# SCC "cons"          #-}     app $ B.cons 120)-        ,F ({-# SCC "lazy cons"     #-}     app $ L.cons 120)-    ])-    , ("snoc",-        [F ({-# SCC "snoc"          #-}     app $ flip B.snoc 120)-        ,F ({-# SCC "lazy snoc"     #-}     app $ flip L.snoc 120)-    ])-    , ("empty",-        [F ({-# SCC "empty"         #-}     const B.empty)-        ,F ({-# SCC "lazy empty"    #-}     const L.empty)-    ])-    , ("head",-        [F ({-# SCC "head"          #-}     app B.head)-        ,F ({-# SCC "lazy head"     #-}     app L.head)-    ])-    , ("tail",-        [F ({-# SCC "tail"          #-}     app B.tail)-        ,F ({-# SCC "lazy tail"     #-}     app L.tail)-    ])--    , ("count",-        [F ({-# SCC "count"         #-}     app $ B.count 10)-        ,F ({-# SCC "lazy count"    #-}     app $ L.count 10)-    ])--    , ("isPrefixOf",-        [F ({-# SCC "isPrefixOf" #-}        app $ B.isPrefixOf-                (C.pack "The Project Gutenberg eBook"))-        ,F ({-# SCC "lazy isPrefixOf" #-}   app $ L.isPrefixOf-                (L.pack [84,104,101,32,80,114,111,106,101-                           ,99,116,32,71,117,116,101,110,98-                           ,101,114,103,32,101,66,111,111,107]))-    ])-    , ("join",-        [F ({-# SCC "join"          #-}     app $ B.join (B.pack [1,2,3]))-        ,F ({-# SCC "lazy join"     #-}     app $ L.join (L.pack [1,2,3]))-    ])---  , ("joinWithByte",---      [F ({-# SCC "joinWithByte"  #-}     app $ uncurry (B.joinWithByte 32))---      ,F ({-# SCC "lazy joinWithByte" #-} app $ uncurry (L.joinWithByte 32))---  ])--    , ("elem",-        [F ({-# SCC "elem"          #-}     app $ B.elem 122)-        ,F ({-# SCC "lazy elem"     #-}     app $ L.elem 122)-    ])-    , ("notElem",-        [F ({-# SCC "notElem"       #-}     app $ B.notElem 122)-        ,F ({-# SCC "lazy notElem"  #-}     app $ L.notElem 122)-    ])-    , ("elemIndex",-        [F ({-# SCC "elemIndex"     #-}     app $ B.elemIndex 122)-        ,F ({-# SCC "lazy elemIndex" #-}    app $ L.elemIndex 122)-    ])-    , ("findIndices",-        [F ({-# SCC "findIndicies"  #-}     app $ B.findIndices (==122))-        ,F ({-# SCC "lazy findIndices" #-}  app $ L.findIndices (==122))-    ])-    , ("elemIndices",-        [F ({-# SCC "elemIndicies"  #-}     app $ B.elemIndices 122)-        ,F ({-# SCC "lazy elemIndices" #-}  app $ L.elemIndices 122)-    ])-    , ("splitAt",-        [F ({-# SCC "splitAt"       #-}     app $ B.splitAt 10000)-        ,F ({-# SCC "lazy splitAt"  #-}     app $ L.splitAt 10000)-    ])-    , ("splitWith",-        [F ({-# SCC "splitWith"     #-}     app $ B.splitWith (==122))-        ,F ({-# SCC "lazy splitWith" #-}    app $ L.splitWith (==122))-    ])--    , ("group",-        [F ({-# SCC "group"         #-}     app B.group)-        ,F ({-# SCC "lazy group"    #-}     app L.group)-    ])-    , ("groupBy",-        [F ({-# SCC "groupBy"       #-}     app $ B.groupBy (==))-        ,F ({-# SCC "lazy groupBy"  #-}     app $ L.groupBy (==))-    ])-    , ("inits",-        [F ({-# SCC "inits"         #-}     app B.inits)-    ])-    , ("tails",-        [F ({-# SCC "tails"         #-}     app B.tails)-    ])---  , ("transpose",[F ({-# SCC "transpose" #-}B.transpose [fps,fps'])])-------------------------------------------------------------------------------- Char8 or ByteString only--    , ("intersperse",-        [F ({-# SCC "intersperse"   #-}     app $ B.intersperse 120 )-    ])-    , ("sort",-        [F ({-# SCC "sort"          #-}     app B.sort)-    ])---  , ("lineIndices",---      [F ({-# SCC "lineIndicies"  #-}     app C.lineIndices)---  ])-    , ("elemIndexEnd",-        [F ({-# SCC "elemIndexEnd"  #-}     app $ B.elemIndexEnd 122)-    ])---  , ("breakSpace",---      [F ({-# SCC "breakSpace"    #-}     app C.breakSpace)---  ])---  , ("dropSpace",---      [F ({-# SCC "dropSpace"     #-}     app C.dropSpace)---  ])---  , ("dropSpaceEnd",---      [F ({-# SCC "dropSpaceEnd"  #-}     app C.dropSpaceEnd)---  ])----  , ("zip",[F ({-# SCC "zip" #-} B.zip fps fps)])--    , ("isSubstringOf",-        [F ({-# SCC "isSubstringOf" #-}     app $ B.isSubstringOf (C.pack "email news"))-    ])-    , ("isSuffixOf",-        [F ({-# SCC "isSuffixOf"    #-}     app $ B.isSuffixOf (C.pack "new eBooks"))-    ])-    , ("spanEnd",-        [F ({-# SCC "spanEnd"       #-}     app $ B.spanEnd (/=122))-    ])-    , ("lines",-        [F ({-# SCC "lines"         #-}     app C.lines)-    ])-    , ("unlines",-        [F ({-# SCC "unlines"       #-}     app C.unlines)-    ])-    , ("words",-        [F ({-# SCC "words"         #-}     app C.words)-    ])-    , ("unwords",-        [F ({-# SCC "unwords"       #-}     app C.unwords)-    ])-- ]--}----------------------------------------------------------------------------data Input = Input String String String [String]--instance Forceable Input where-  force (Input s x y xs) = force s >> force x >> force y >> force xs--class (Eq a, Ord a) => Ap a where app :: (a -> b) -> Input -> b--instance Ap String            where app f (Input _ x _ _)  = f x-instance Ap [String]          where app f (Input _ _ _ xs) = f xs-instance Ap (String,String)   where app f (Input _ x y _)  = f (x, y)-instance Ap (String,[String]) where app f (Input s _ _ xs) = f (s, xs)--app2 :: Ap (a, b) => (a -> b -> c) -> Input -> c-app2 = app . uncurry--splitEvery :: Int -> [a] -> [[a]]-splitEvery n = L.unfoldr split-  where split [] = Nothing-        split s  = Just (Prelude.splitAt n s)
− tests/Bench/StreamList.hs
@@ -1,395 +0,0 @@------ list like wrappers for abstract streams------ These specify the versions used when fusion occurs.------ So we can check our stream implementations, which are only used when--- fusion happens, are fast.-----module Bench.StreamList where--import Prelude-import qualified Prelude -import Properties.Utils--import qualified Data.Stream as Stream---- * Basic interface-cons            :: a -> [a] -> [a]-snoc            :: [a] -> a -> [a]-append          :: [a] -> [a] -> [a]-head            :: [a] -> a-last            :: [a] -> a-tail            :: [a] -> [a]-init            :: [a] -> [a]-null            :: [a] -> Bool-length          :: [a] -> Int----- * List transformations-map             :: (a -> b) -> [a] -> [b]---reverse       :: [a] -> [a]-intersperse     :: a -> [a] -> [a]-intercalate   :: [a] -> [[a]] -> [a]---transpose     :: [[a]] -> [[a]]---- * Reducing lists (folds)-foldl           :: (b -> a -> b) -> b -> [a] -> b-foldl'          :: (b -> a -> b) -> b -> [a] -> b-foldl1          :: (a -> a -> a) -> [a] -> a-foldl1'         :: (a -> a -> a) -> [a] -> a-foldr           :: (a -> b -> b) -> b -> [a] -> b-foldr1          :: (a -> a -> a) -> [a] -> a---- ** Special folds-concat          :: [[a]] -> [a]-concatMap       :: (a -> [b]) -> [a] -> [b]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (a -> Bool) -> [a] -> Bool-all             :: (a -> Bool) -> [a] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: Ord a => [a] -> a-minimum         :: Ord a => [a] -> a---- * Building lists--- ** Scans-scanl           :: (a -> b -> a) -> a -> [b] -> [a]-scanl1          :: (a -> a -> a) -> [a] -> [a]--{--scanr           :: (a -> b -> b) -> b -> [a] -> [b]-scanr1          :: (a -> a -> a) -> [a] -> [a]---- ** Accumulating maps-mapAccumL       :: (c -> a -> (c, b)) -> c -> [a] -> (c, [b])-mapAccumR       :: (c -> a -> (c, b)) -> c -> [a] -> (c, [b])--}---- ** Infinite lists-iterate         :: (a -> a) -> a -> [a]-repeat          :: a -> [a]-replicate       :: Int -> a -> [a]-cycle           :: [a] -> [a]---- ** Unfolding-unfoldr         :: (b -> Maybe (a, b)) -> b -> [a]---- * Sublists--- ** Extracting sublists-take            :: Int -> [a] -> [a]-drop            :: Int -> [a] -> [a]-splitAt         :: Int -> [a] -> ([a], [a])-takeWhile       :: (a -> Bool) -> [a] -> [a]-dropWhile       :: (a -> Bool) -> [a] -> [a]--{--span          :: (a -> Bool) -> [a] -> ([a], [a])-break           :: (a -> Bool) -> [a] -> ([a], [a])-group           :: [a] -> [[a]]-inits           :: [a] -> [[a]]-tails           :: [a] -> [[a]]--}---- * Predicates-isPrefixOf      :: Eq a => [a] -> [a] -> Bool-{--isSuffixOf      :: [a] -> [a] -> Bool-isInfixOf       :: [a] -> [a] -> Bool--}---- * Searching lists--- ** Searching by equality-elem            :: Eq a => a -> [a] -> Bool---notElem       :: Eq a => a -> [a] -> Bool-lookup          :: Eq a => a -> [(a, b)] -> Maybe b---- ** Searching with a predicate-find            :: (a -> Bool) -> [a] -> Maybe a-filter          :: (a -> Bool) -> [a] -> [a]---partition     :: (a -> Bool) -> [a] -> ([a], [a])---- * Indexing lists-(!!)            :: [a] -> Int -> a-findIndex       :: (a -> Bool) -> [a] -> Maybe Int-elemIndex       :: Eq a => a -> [a] -> Maybe Int-elemIndices     :: Eq a => a -> [a] -> [Int]-findIndices     :: (a -> Bool) -> [a] -> [Int]---- * Zipping and unzipping lists-zip             :: [a] -> [b] -> [(a, b)]-zip3            :: [a] -> [b] -> [c] -> [(a, b, c)]-{--zip4            :: [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]-zip5            :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a, b, c, d, e)]-zip6            :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [(a, b, c, d, e, f)]-zip7            :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [(a, b, c, d, e, f, g)]--}--zipWith         :: (a -> b -> c) -> [a] -> [b] -> [c]-zipWith3        :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]-{--zipWith4        :: (a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]-zipWith5        :: (a -> b -> c -> d -> e -> f) -> [a] -> [b] -> [c] -> [d] -> [e] -> [f]-zipWith6        :: (a -> b -> c -> d -> e -> f -> g) -> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]-zipWith7        :: (a -> b -> c -> d -> e -> f -> g -> h) -> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [h]--}--unzip           :: [(a, b)] -> ([a], [b])-{--unzip3          :: [(a, b, c)] -> ([a], [b], [c])-unzip4          :: [(a, b, c, d)] -> ([a], [b], [c], [d])-unzip5          :: [(a, b, c, d, e)] -> ([a], [b], [c], [d], [e])-unzip6          :: [(a, b, c, d, e, f)] -> ([a], [b], [c], [d], [e], [f])-unzip7          :: [(a, b, c, d, e, f, g)] -> ([a], [b], [c], [d], [e], [f], [g])--}---- * Special lists--- ** Functions on strings-{--unlines         :: [String] -> String-lines           :: String -> [String]--}-{--words           :: String -> [String]-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [a] -> [a]-delete          :: a -> [a] -> [a]-(\\)            :: [a] -> [a] -> [a]-union           :: [a] -> [a] -> [a]-intersect       :: [a] -> [a] -> [a]---- ** Ordered lists -sort            :: [a] -> [a]-insert          :: a -> [a] -> [a]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (a -> a -> Bool) -> [a] -> [a]-deleteBy        :: (a -> a -> Bool) -> a -> [a] -> [a]-deleteFirstsBy  :: (a -> a -> Bool) -> [a] -> [a] -> [a]-unionBy         :: (a -> a -> Bool) -> [a] -> [a] -> [a]-intersectBy     :: (a -> a -> Bool) -> [a] -> [a] -> [a]-groupBy         :: (a -> a -> Bool) -> [a] -> [[a]]--}---- *** User-supplied comparison (replacing an Ord context)-insertBy        :: (a -> a -> Ordering) -> a -> [a] -> [a]-{--sortBy          :: (a -> a -> Ordering) -> [a] -> [a]--}-maximumBy       :: (a -> a -> Ordering) -> [a] -> a-minimumBy       :: (a -> a -> Ordering) -> [a] -> a---- * The \"generic\" operations-genericLength           :: [a] -> I-genericTake             :: I -> [a] -> [a]-genericDrop             :: I -> [a] -> [a]-genericIndex            :: [a] -> I -> a-genericSplitAt          :: I -> [a] -> ([a], [a])-genericReplicate        :: I -> a -> [a]--s = Stream.stream-u = Stream.unstream---- * Basic interface-cons            = \x xs  -> u $ Stream.cons   x (s xs)-snoc            = \xs x  -> u $ Stream.snoc   (s xs) x-append          = \xs ys -> u $ Stream.append (s xs) (s ys)-head            = \xs    ->     Stream.head   (s xs)-last            = \xs    ->     Stream.last   (s xs)-tail            = \xs    -> u $ Stream.tail   (s xs)-init            = \xs    -> u $ Stream.init   (s xs)-null            = \xs    ->     Stream.null   (s xs)-length          = \xs    ->     Stream.length (s xs)----- * List transformations-map             = \f   xs -> u $ Stream.map f (s xs)---reverse               = Stream.reverse-intersperse     = \sep xs -> u $ Stream.intersperse sep (s xs)-intercalate     = \sep xs ->     Stream.concat (Stream.intersperse sep(s xs))----transpose     = Stream.transpose---- * Reducing lists (folds)-foldl           = \f z xs -> Stream.foldl   f z (s xs)-foldl'          = \f z xs -> Stream.foldl'  f z (s xs)-foldl1          = \f   xs -> Stream.foldl1  f   (s xs)-foldl1'         = \f   xs -> Stream.foldl1' f   (s xs)-foldr           = \f z xs -> Stream.foldr   f z (s xs)-foldr1          = \f   xs -> Stream.foldr1  f   (s xs)---- ** Special folds-concat          = \  xs -> Stream.concat (s xs)-    -- concatMap :: (a -> Stream b) -> Stream a -> Stream b-concatMap       = \f xs -> u $ Stream.concatMap (s . f)  (s xs)-and             = \  xs -> Stream.and   (s xs)-or              = \  xs -> Stream.or    (s xs)-any             = \f xs -> Stream.any f (s xs)-all             = \f xs -> Stream.all f (s xs)-sum             = \  xs -> Stream.sum   (s xs)-product         = \  xs -> Stream.product   (s xs)-maximum         = \  xs -> Stream.maximum   (s xs)-{-# INLINE maximum #-}-minimum         = \  xs -> Stream.minimum   (s xs)-{-# INLINE minimum #-}---- * Building lists--- ** Scans-scanl           = \f z xs -> u (Stream.scanl f z (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--scanl1          = \f xs -> u (Stream.scanl1 f (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--{--scanr           = \f z xs -> u (Stream.scanr f z (Stream.cons bottom (s xs)))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--}--{--scanr1          = Stream.scanr1---- ** Accumulating maps-mapAccumL       = Stream.mapAccumL-mapAccumR       = Stream.mapAccumR--}--- ** Infinite lists-iterate         = \f x -> u $ Stream.iterate   f x-repeat          = \  x -> u $ Stream.repeat      x-replicate       = \n x -> u $ Stream.replicate n x-cycle           = \ xs -> u $ Stream.cycle    (s xs)---- ** Unfolding-unfoldr         = \f x -> u $ Stream.unfoldr f x---- * Sublists--- ** Extracting sublists-take            = \n xs -> u $ Stream.take    n (s xs)-drop            = \n xs -> u $ Stream.drop    n (s xs)-splitAt         = \n xs ->     Stream.splitAt n (s xs)-takeWhile       = \f xs -> u $ Stream.takeWhile f (s xs)-dropWhile       = \f xs -> u $ Stream.dropWhile f (s xs)-{--span          = Stream.span-break           = Stream.break-group           = Stream.group-inits           = Stream.inits-tails           = Stream.tails--}---- * Predicates-isPrefixOf      = \xs ys -> Stream.isPrefixOf (s xs) (s ys)-{--isSuffixOf      = Stream.isSuffixOf-isInfixOf       = Stream.isInfixOf--}--- * Searching lists--- ** Searching by equality-elem            = \key xs -> Stream.elem   key (s xs)---notElem               = Stream.notElem-lookup          = \key xs -> Stream.lookup key (s xs)---- ** Searching with a predicate-find            = \p xs ->     Stream.find   p (s xs)-filter          = \p xs -> u $ Stream.filter p (s xs)---partition     = Stream.partition---- * Indexing lists-(!!)            = \xs n -> Stream.index (Stream.stream xs) n---Wirdness: Stream.index needs to be eta-expanded and fully applied for the--- code to be any good-findIndex       = \f xs -> Stream.findIndex f (s xs)-findIndices     = \p xs -> u (Stream.findIndices p (s xs))-elemIndex       = \x xs -> Stream.findIndex (x==) (s xs)-elemIndices     = \x xs -> u (Stream.findIndices (x==) (s xs))-{-# INLINE elemIndex #-}-{-# INLINE elemIndices #-}----- * Zipping and unzipping lists-zip  = \xs ys    -> u (Stream.zip (s xs) (s ys))-zip3 = \xs ys zs -> u (Stream.zip3 (s xs) (s ys) (s zs))--zipWith         = \f xs ys    -> u (Stream.zipWith f (s xs) (s ys))-zipWith3        = \f xs ys zs -> u (Stream.zipWith3 f (s xs) (s ys) (s zs))--unzip           = Stream.unzip . s--{--zip4            = Stream.zip4-zip5            = Stream.zip5-zip6            = Stream.zip6-zip7            = Stream.zip7-zipWith4        = Stream.zipWith4-zipWith5        = Stream.zipWith5-zipWith6        = Stream.zipWith6-zipWith7        = Stream.zipWith7-unzip3          = Stream.unzip3-unzip4          = Stream.unzip4-unzip5          = Stream.unzip5-unzip6          = Stream.unzip6-unzip7          = Stream.unzip7--}---- * Special lists--- ** Functions on strings-{--unlines         = \xs -> Stream.concatMap (\x -> x ++ ['\n']) (s xs)-lines           = \xs -> u (Stream.lines (s xs))--}--{--words           = Stream.words-unwords         = Stream.unwords---- ** \"Set\" operations-nub             = Stream.nub-delete          = Stream.delete-(\\)            = (Stream.\\)-union           = Stream.union-intersect       = Stream.intersect---- ** Ordered lists -sort            = Stream.sort-insert          = Stream.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Stream.nubBy-deleteBy        = Stream.deleteBy-deleteFirstsBy  = Stream.deleteFirstsBy-unionBy         = Stream.unionBy-intersectBy     = Stream.intersectBy-groupBy         = Stream.groupBy--}---- *** User-supplied comparison (replacing an Ord context)-{--sortBy          = Stream.sortBy--}-insertBy        = \cmp x xs -> u $ Stream.insertBy cmp x (s xs)--maximumBy       = \cmp xs -> Stream.maximumBy cmp (s xs)-minimumBy       = \cmp xs -> Stream.minimumBy cmp (s xs)---- * The \"generic\" operations-genericLength           = \xs -> Stream.genericLength (s xs)-genericTake             = \n xs -> u $ Stream.genericTake n (s xs)-genericDrop             = \n xs -> u $ Stream.genericDrop n (s xs)-genericIndex            = \xs n -> Stream.genericIndex (s xs) n-genericSplitAt          = \n xs -> Stream.genericSplitAt n (s xs)-genericReplicate        = \n x  -> genericTake n (Prelude.repeat x)
− tests/Bench/StreamVsList.hs
@@ -1,423 +0,0 @@-{-# OPTIONS -fglasgow-exts #-}--- ^ unboxed strings------ Benchmark tool.--- Compare a function against equivalent code from other libraries for--- space and time.----import Bench.Utils--import qualified Data.List.Stream as L -- our list functions-import qualified Bench.StreamList as S -- our stream versions--import qualified Data.Stream as Stream--import Data.Char-import Data.Word-import Data.Int--import System.IO-import Control.Monad-import Text.Printf--main :: IO ()-main = do-    -- initialise-    let input = Input (take 1000 string) string string2 (splitEvery 1000 string2)-    force input--    putStrLn "Benchmarking Data.Stream <=> Data.List.Stream"-    putStrLn "=============================================\n"--    printf "# Size of test data: %dk\n" ((floor $ (fromIntegral (length string)) / 1024) :: Int)-    printf "#List\t List.Stream\n"---    run 5 input tests----------------------------------------------------------------------------s = Stream.stream-u = Stream.unstream---tests =- [-    -- * Basic interface--    ("++",  -- should be identical-        [F ( app  (uncurry ((L.++)     :: S -> S -> S) )    )-        ,F ( app  (uncurry ((S.append) :: S -> S -> S) )    ) ]-    )--    , ("head",-        [F ( app  (L.head :: S -> Char) )-        ,F ( app  (S.head :: S -> Char) )]-    )--    , ("last",-        [F (     app (L.last :: S -> Char))-        ,F (     app (S.last :: S -> Char))-    ])--    , ("init",-        [F (     app (L.init :: S -> S))-        ,F (     app (S.init :: S -> S))-    ])--    , ("null",-        [F (     app (L.null :: S -> Bool))-        ,F (     app (S.null :: S -> Bool))-    ])--    , ("length",-        [F (      app  (L.length :: S -> Int))-        ,F (      app  (S.length :: S -> Int))-    ])--    -- * List transformations-    , ("map",-        [F (      app ( L.map toUpper :: S -> S ))-        ,F (      app ( S.map toUpper :: S -> S ))-    ])-{--    , ("reverse",-        [F (     app (L.reverse :: S -> S ))-        ,F (     app (S.reverse :: S -> S ))-    ])--}-    , ("intersperse",-        [F ( app  (L.intersperse 'x' :: S -> S)     )-        ,F ( app  (S.intersperse 'x' :: S -> S)     ) ]-     )--    , ("intercalate",-        [F ( app2  (L.intercalate :: S -> [S] -> S)     )-        ,F ( app2  (S.intercalate :: S -> [S] -> S)     ) ]-     )--    -- transpose is too slow.--    -- * Reducing lists (folds)--    , ("foldl'",-        [F (     app  ( L.foldl' (\a _ -> a+1) 0 :: S -> Int  ) )-        ,F (     app  ( S.foldl' (\a _ -> a+1) 0  :: S -> Int ) )-    ])--{--    , ("foldr",-        [F (     app  ( L.foldr (\_ a -> a+1) 0 :: S -> Int  ) )-        ,F (     app  ( S.foldr (\_ a -> a+1) 0 :: S -> Int ) )-    ])--}--    -- ** Special folds--    , ("concat",-        [F ( app   ((\ss -> L.concat (ss++ss++ss)) :: [S] -> S)               )-        ,F ( app   ((\ss -> S.concat (ss++ss++ss)) :: [S] -> S)               ) ]-     )--    , ("concatMap",-        [F ( app   (L.concatMap (\c -> [c, c, c]) :: S -> S))-        ,F ( app   (S.concatMap (\c -> [c, c, c]) :: S -> S)) ]-     )--    , ("any",-        [F (     app ( L.any (=='x') :: S -> Bool       ))-        ,F (     app ( S.any (=='x') :: S -> Bool       ))-    ])-    , ("all",-        [F (     app ( L.all (=='x') :: S -> Bool       ))-        ,F (     app ( S.all (=='x') :: S -> Bool       ))-    ])-    , ("maximum",-        [F (     app (L.maximum :: S -> Char) )-        ,F (     app (S.maximum :: S -> Char) )-    ])-    , ("minimum",-        [F (     app (L.minimum :: S -> Char) )-        ,F (     app (S.minimum :: S -> Char) )-    ])--    -- * Building lists-    -- ** Scans--    -- * Sublists-    -- ** Extracting sublists-    , ("take",-        [F (     app ( L.take 100000 :: S -> S) )-        ,F (     app ( S.take 100000 :: S -> S) )-    ])-    , ("drop",-        [F (     app ( L.drop 100000 :: S -> S) )-        ,F (     app ( S.drop 100000 :: S -> S) )-    ])--    , ("takeWhile",-        [F (     app ( L.takeWhile (/='z') :: S -> S  ))-        ,F (    app  ( S.takeWhile (=='z')  :: S -> S ))-    ])-    , ("dropWhile",-        [F (     app ( L.dropWhile (/='z')  :: S -> S ) )-        ,F (    app  ( S.dropWhile (/='z')  :: S -> S ) )-    ])--    -- * Searching lists-    -- ** Searching by equality-    , ("elem",-        [F (     app (L.elem ('Z') :: S -> Bool) )-        ,F (     app (S.elem ('Z') :: S -> Bool) )-    ])-{--    , ("notElem",-        [F (     app (L.notElem ('Z') :: S -> Bool) )-        ,F (     app (S.notElem ('Z') :: S -> Bool) )-    ])--}-    -- ** Searching with a predicate--    , ("find",-        [F (     app (L.find (=='Z') :: S -> Maybe Char) )-        ,F (     app (S.find (=='Z') :: S -> Maybe Char) )-    ])--    , ("filter",-        [F (      app ( L.filter isSpace :: S -> S ))-        ,F (      app ( S.filter isSpace :: S -> S ))-    ])--    -- * Indexing lists--    , ("index",-        [F (      app ((\x -> x L.!! 300000) ::  S -> Char  ))-        ,F (      app ((\x -> x S.!! 300000) ::  S -> Char  ))-    ])--    , ("elemIndex",-        [F (    app (L.elemIndex ('Z') :: S -> Maybe Int ) )-        ,F (    app (S.elemIndex ('Z') :: S -> Maybe Int ) )-    ])--    , ("elemIndices",-        [F (    app (L.elemIndices ('Z') :: S -> [Int] ) )-        ,F (    app (S.elemIndices ('Z') :: S -> [Int] ) )-    ])--    , ("findIndex",-        [F (    app (L.findIndex (=='Z') :: S -> Maybe Int ) )-        ,F (    app (S.findIndex (=='Z') :: S -> Maybe Int ) )-    ])--    , ("findIndices",-        [F (    app (L.findIndices (=='Z') :: S -> [Int] ) )-        ,F (    app (S.findIndices (=='Z') :: S -> [Int] ) )-    ])--    -- * Zipping and unzipping lists--    , ("zip",-        [F (     app (uncurry (L.zip) :: (S,S) -> [(Char, Char)]     ))-        ,F (     app (uncurry (S.zip) :: (S,S) -> [(Char, Char)]     ))-    ])--    , ("zipWith",-        [F (     app (uncurry (L.zipWith (,)) :: (S,S) -> [(Char, Char)]     ))-        ,F (     app (uncurry (S.zipWith (,)) :: (S,S) -> [(Char, Char)]     ))-    ])--    , ("replicate",-        [F (    const $ L.replicate 2000000 'x')-        ,F (    const $ S.replicate 2000000 'x')-    ])-- ]---{----    , ("span",-        [F ({-# SCC "span"          #-}     app $ B.span (/=122))-        ,F ({-# SCC "lazy span"     #-}     app $ L.span (/=122))-    ])-    , ("break",-        [F ({-# SCC "break"         #-}     app $ B.break (==122))-        ,F ({-# SCC "lazy break"    #-}     app $ L.break (==122))-    ])-    , ("split",-        [F ({-# SCC "split"         #-}     app $ B.split 0x0a)-        ,F ({-# SCC "lazy split"    #-}     app $ L.split 0x0a)-    ])---  , ("breakByte",---      [F ({-# SCC "breakChar"     #-}     app $ B.breakByte 122)---      ,F ({-# SCC "lazy breakChar" #-}    app $ L.breakByte 122)---  ])---  , ("spanByte",---      [F ({-# SCC "spanChar"      #-}     app $ B.spanByte 122)---      ,F ({-# SCC "lazy spanChar" #-}     app $ L.spanByte 122)---  ])--    , ("cons",-        [F ({-# SCC "cons"          #-}     app $ B.cons 120)-        ,F ({-# SCC "lazy cons"     #-}     app $ L.cons 120)-    ])-    , ("snoc",-        [F ({-# SCC "snoc"          #-}     app $ flip B.snoc 120)-        ,F ({-# SCC "lazy snoc"     #-}     app $ flip L.snoc 120)-    ])-    , ("empty",-        [F ({-# SCC "empty"         #-}     const B.empty)-        ,F ({-# SCC "lazy empty"    #-}     const L.empty)-    ])-    , ("head",-        [F ({-# SCC "head"          #-}     app B.head)-        ,F ({-# SCC "lazy head"     #-}     app L.head)-    ])-    , ("tail",-        [F ({-# SCC "tail"          #-}     app B.tail)-        ,F ({-# SCC "lazy tail"     #-}     app L.tail)-    ])--    , ("count",-        [F ({-# SCC "count"         #-}     app $ B.count 10)-        ,F ({-# SCC "lazy count"    #-}     app $ L.count 10)-    ])--    , ("isPrefixOf",-        [F ({-# SCC "isPrefixOf" #-}        app $ B.isPrefixOf-                (C.pack "The Project Gutenberg eBook"))-        ,F ({-# SCC "lazy isPrefixOf" #-}   app $ L.isPrefixOf-                (L.pack [84,104,101,32,80,114,111,106,101-                           ,99,116,32,71,117,116,101,110,98-                           ,101,114,103,32,101,66,111,111,107]))-    ])-    , ("join",-        [F ({-# SCC "join"          #-}     app $ B.join (B.pack [1,2,3]))-        ,F ({-# SCC "lazy join"     #-}     app $ L.join (L.pack [1,2,3]))-    ])---  , ("joinWithByte",---      [F ({-# SCC "joinWithByte"  #-}     app $ uncurry (B.joinWithByte 32))---      ,F ({-# SCC "lazy joinWithByte" #-} app $ uncurry (L.joinWithByte 32))---  ])--    , ("elem",-        [F ({-# SCC "elem"          #-}     app $ B.elem 122)-        ,F ({-# SCC "lazy elem"     #-}     app $ L.elem 122)-    ])-    , ("notElem",-        [F ({-# SCC "notElem"       #-}     app $ B.notElem 122)-        ,F ({-# SCC "lazy notElem"  #-}     app $ L.notElem 122)-    ])-    , ("elemIndex",-        [F ({-# SCC "elemIndex"     #-}     app $ B.elemIndex 122)-        ,F ({-# SCC "lazy elemIndex" #-}    app $ L.elemIndex 122)-    ])-    , ("findIndices",-        [F ({-# SCC "findIndicies"  #-}     app $ B.findIndices (==122))-        ,F ({-# SCC "lazy findIndices" #-}  app $ L.findIndices (==122))-    ])-    , ("elemIndices",-        [F ({-# SCC "elemIndicies"  #-}     app $ B.elemIndices 122)-        ,F ({-# SCC "lazy elemIndices" #-}  app $ L.elemIndices 122)-    ])-    , ("splitAt",-        [F ({-# SCC "splitAt"       #-}     app $ B.splitAt 10000)-        ,F ({-# SCC "lazy splitAt"  #-}     app $ L.splitAt 10000)-    ])-    , ("splitWith",-        [F ({-# SCC "splitWith"     #-}     app $ B.splitWith (==122))-        ,F ({-# SCC "lazy splitWith" #-}    app $ L.splitWith (==122))-    ])--    , ("group",-        [F ({-# SCC "group"         #-}     app B.group)-        ,F ({-# SCC "lazy group"    #-}     app L.group)-    ])-    , ("groupBy",-        [F ({-# SCC "groupBy"       #-}     app $ B.groupBy (==))-        ,F ({-# SCC "lazy groupBy"  #-}     app $ L.groupBy (==))-    ])-    , ("inits",-        [F ({-# SCC "inits"         #-}     app B.inits)-    ])-    , ("tails",-        [F ({-# SCC "tails"         #-}     app B.tails)-    ])---  , ("transpose",[F ({-# SCC "transpose" #-}B.transpose [fps,fps'])])-------------------------------------------------------------------------------- Char8 or ByteString only--    , ("intersperse",-        [F ({-# SCC "intersperse"   #-}     app $ B.intersperse 120 )-    ])-    , ("sort",-        [F ({-# SCC "sort"          #-}     app B.sort)-    ])---  , ("lineIndices",---      [F ({-# SCC "lineIndicies"  #-}     app C.lineIndices)---  ])-    , ("elemIndexEnd",-        [F ({-# SCC "elemIndexEnd"  #-}     app $ B.elemIndexEnd 122)-    ])---  , ("breakSpace",---      [F ({-# SCC "breakSpace"    #-}     app C.breakSpace)---  ])---  , ("dropSpace",---      [F ({-# SCC "dropSpace"     #-}     app C.dropSpace)---  ])---  , ("dropSpaceEnd",---      [F ({-# SCC "dropSpaceEnd"  #-}     app C.dropSpaceEnd)---  ])----  , ("zip",[F ({-# SCC "zip" #-} B.zip fps fps)])--    , ("isSubstringOf",-        [F ({-# SCC "isSubstringOf" #-}     app $ B.isSubstringOf (C.pack "email news"))-    ])-    , ("isSuffixOf",-        [F ({-# SCC "isSuffixOf"    #-}     app $ B.isSuffixOf (C.pack "new eBooks"))-    ])-    , ("spanEnd",-        [F ({-# SCC "spanEnd"       #-}     app $ B.spanEnd (/=122))-    ])-    , ("lines",-        [F ({-# SCC "lines"         #-}     app C.lines)-    ])-    , ("unlines",-        [F ({-# SCC "unlines"       #-}     app C.unlines)-    ])-    , ("words",-        [F ({-# SCC "words"         #-}     app C.words)-    ])-    , ("unwords",-        [F ({-# SCC "unwords"       #-}     app C.unwords)-    ])-- ]--}----------------------------------------------------------------------------data Input = Input String String String [String]--instance Forceable Input where-  force (Input s x y xs) = force s >> force x >> force y >> force xs--class (Eq a, Ord a) => Ap a where app :: (a -> b) -> Input -> b--instance Ap String            where app f (Input _ x _ _)  = f x-instance Ap [String]          where app f (Input _ _ _ xs) = f xs-instance Ap (String,String)   where app f (Input _ x y _)  = f (x, y)-instance Ap (String,[String]) where app f (Input s _ _ xs) = f (s, xs)--app2 :: Ap (a, b) => (a -> b -> c) -> Input -> c-app2 = app . uncurry--splitEvery :: Int -> [a] -> [[a]]-splitEvery n = L.unfoldr split-  where split [] = Nothing-        split s  = Just (Prelude.splitAt n s)
− tests/Bench/Utils.hs
@@ -1,129 +0,0 @@-{-# OPTIONS -cpp -fglasgow-exts #-}-module Bench.Utils where------- Benchmark tool.--- Compare a function against equivalent code from other libraries for--- space and time.-----import Data.List-import Data.Char-import Data.Word-import Data.Int--import System.Mem-import Control.Concurrent--import System.IO-import System.CPUTime-import System.IO.Unsafe-import Control.Monad-import Control.Exception-import Text.Printf--import qualified Data.ByteString.Char8 as P-import qualified Data.ByteString       as S---run :: Int -> a -> [(String, [F a])] -> IO ()-run c x tests = sequence_ $ zipWith (doit c x) [1..] tests---doit :: Int -> a -> Int -> (String, [F a]) -> IO ()-doit count x n (s,ls) = do-    printf "%2d %s\n   " n (show s)-    fn ls-    hFlush stdout-  where fn xs = case xs of-                    [f,g]   -> runN count f x >> putStr "\n   "-                            >> runN count g x >> putStr "\n\n"-                    [f]     -> runN count f x >> putStr "\n\n"-                    _       -> return ()-        run f x = dirtyCache fps >> performGC >> threadDelay 100 >> time f x-        runN 0 f x = return ()-        runN c f x = run f x >> runN (c-1) f x---dirtyCache x = evaluate (S.foldl1' (+) x)-{-# NOINLINE dirtyCache #-}---time :: F a -> a -> IO ()-time (F f) a = do-    start <- getCPUTime-    v     <- force (f a)-    case v of-        B -> printf "--\t"-        _ -> do-            end   <- getCPUTime-            let diff = (fromIntegral (end - start)) / (10^12)-            printf "%0.3f  " (diff :: Double)-    hFlush stdout------------------------------------------------------------------------------ --- an existential list of testables----data F a = forall b . Forceable b => F (a -> b)--data Result = T | B------- a bit deepSeqish----class Forceable a where-    force :: a -> IO Result-    force v = v `seq` return T--#if !defined(HEAD)-instance Forceable P.ByteString where-    force v = P.length v `seq` return T-#endif--instance Forceable a => Forceable (Maybe a) where-    force Nothing  = return T-    force (Just v) = force v `seq` return T--instance Forceable a => Forceable [a] where-    force xs = mapM_ force xs >> return T--instance (Forceable a, Forceable b) => Forceable (a,b) where-    force (a,b) = force a >> force b--instance Forceable Int-instance Forceable Int64-instance Forceable Bool-instance Forceable Char-instance Forceable Word8-instance Forceable Ordering---- used to signal undefinedness-instance Forceable () where force () = return B-------------------------------------------------------------------------------- some large strings to play with-----string :: String-string = P.unpack (unsafePerformIO (P.readFile dict))-{-# NOINLINE string #-}--string2 :: String-string2 = P.unpack (unsafePerformIO (P.readFile dict2))-{-# NOINLINE string2 #-}---- just for dirtying the cache-fps :: P.ByteString-fps = (unsafePerformIO (P.readFile dict2))-{-# NOINLINE fps #-}--dict  = "Bench/bigdata"-dict2 = "Bench/data"---- Some short hand.-type X = Int-type W = Word8-type S = String
− tests/Bench/data
@@ -1,3925 +0,0 @@-The Project Gutenberg eBook, Utopia, by Thomas More, Edited by Henry Morley
-
-
-This eBook is for the use of anyone anywhere at no cost and with
-almost no restrictions whatsoever.  You may copy it, give it away or
-re-use it under the terms of the Project Gutenberg License included
-with this eBook or online at www.gutenberg.net
-
-
-
-
-
-Title: Utopia
-
-
-Author: Thomas More
-
-Release Date: April 22, 2005  [eBook #2130]
-
-Language: English
-
-Character set encoding: ISO-646-US (US-ASCII)
-
-
-***START OF THE PROJECT GUTENBERG EBOOK UTOPIA***
-
-
-
-
-
-
-Transcribed from the 1901 Cassell & Company Edition by David Price, email
-ccx074@coventry.ac.uk
-
-
-
-
-
-UTOPIA
-
-
-INTRODUCTION
-
-
-Sir Thomas More, son of Sir John More, a justice of the King's Bench, was
-born in 1478, in Milk Street, in the city of London.  After his earlier
-education at St. Anthony's School, in Threadneedle Street, he was placed,
-as a boy, in the household of Cardinal John Morton, Archbishop of
-Canterbury and Lord Chancellor.  It was not unusual for persons of wealth
-or influence and sons of good families to be so established together in a
-relation of patron and client.  The youth wore his patron's livery, and
-added to his state.  The patron used, afterwards, his wealth or influence
-in helping his young client forward in the world.  Cardinal Morton had
-been in earlier days that Bishop of Ely whom Richard III. sent to the
-Tower; was busy afterwards in hostility to Richard; and was a chief
-adviser of Henry VII., who in 1486 made him Archbishop of Canterbury, and
-nine months afterwards Lord Chancellor.  Cardinal Morton--of talk at
-whose table there are recollections in "Utopia"--delighted in the quick
-wit of young Thomas More.  He once said, "Whoever shall live to try it,
-shall see this child here waiting at table prove a notable and rare man."
-
-At the age of about nineteen, Thomas More was sent to Canterbury College,
-Oxford, by his patron, where he learnt Greek of the first men who brought
-Greek studies from Italy to England--William Grocyn and Thomas Linacre.
-Linacre, a physician, who afterwards took orders, was also the founder of
-the College of Physicians.  In 1499, More left Oxford to study law in
-London, at Lincoln's Inn, and in the next year Archbishop Morton died.
-
-More's earnest character caused him while studying law to aim at the
-subduing of the flesh, by wearing a hair shirt, taking a log for a
-pillow, and whipping himself on Fridays.  At the age of twenty-one he
-entered Parliament, and soon after he had been called to the bar he was
-made Under-Sheriff of London.  In 1503 he opposed in the House of Commons
-Henry VII.'s proposal for a subsidy on account of the marriage portion of
-his daughter Margaret; and he opposed with so much energy that the House
-refused to grant it.  One went and told the king that a beardless boy had
-disappointed all his expectations.  During the last years, therefore, of
-Henry VII.  More was under the displeasure of the king, and had thoughts
-of leaving the country.
-
-Henry VII. died in April, 1509, when More's age was a little over thirty.
-In the first years of the reign of Henry VIII. he rose to large practice
-in the law courts, where it is said he refused to plead in cases which he
-thought unjust, and took no fees from widows, orphans, or the poor.  He
-would have preferred marrying the second daughter of John Colt, of New
-Hall, in Essex, but chose her elder sister, that he might not subject her
-to the discredit of being passed over.
-
-In 1513 Thomas More, still Under-Sheriff of London, is said to have
-written his "History of the Life and Death of King Edward V., and of the
-Usurpation of Richard III."  The book, which seems to contain the
-knowledge and opinions of More's patron, Morton, was not printed until
-1557, when its writer had been twenty-two years dead.  It was then
-printed from a MS. in More's handwriting.
-
-In the year 1515 Wolsey, Archbishop of York, was made Cardinal by Leo X.;
-Henry VIII. made him Lord Chancellor, and from that year until 1523 the
-King and the Cardinal ruled England with absolute authority, and called
-no parliament.  In May of the year 1515 Thomas More--not knighted yet--was
-joined in a commission to the Low Countries with Cuthbert Tunstal and
-others to confer with the ambassadors of Charles V., then only Archduke
-of Austria, upon a renewal of alliance.  On that embassy More, aged about
-thirty-seven, was absent from England for six months, and while at
-Antwerp he established friendship with Peter Giles (Latinised AEgidius),
-a scholarly and courteous young man, who was secretary to the
-municipality of Antwerp.
-
-Cuthbert Tunstal was a rising churchman, chancellor to the Archbishop of
-Canterbury, who in that year (1515) was made Archdeacon of Chester, and
-in May of the next year (1516) Master of the Rolls.  In 1516 he was sent
-again to the Low Countries, and More then went with him to Brussels,
-where they were in close companionship with Erasmus.
-
-More's "Utopia" was written in Latin, and is in two parts, of which the
-second, describing the place ([Greek text]--or Nusquama, as he called it
-sometimes in his letters--"Nowhere"), was probably written towards the
-close of 1515; the first part, introductory, early in 1516.  The book was
-first printed at Louvain, late in 1516, under the editorship of Erasmus,
-Peter Giles, and other of More's friends in Flanders.  It was then
-revised by More, and printed by Frobenius at Basle in November, 1518.  It
-was reprinted at Paris and Vienna, but was not printed in England during
-More's lifetime.  Its first publication in this country was in the
-English translation, made in Edward's VI.'s reign (1551) by Ralph
-Robinson.  It was translated with more literary skill by Gilbert Burnet,
-in 1684, soon after he had conducted the defence of his friend Lord
-William Russell, attended his execution, vindicated his memory, and been
-spitefully deprived by James II. of his lectureship at St. Clement's.
-Burnet was drawn to the translation of "Utopia" by the same sense of
-unreason in high places that caused More to write the book.  Burnet's is
-the translation given in this volume.
-
-The name of the book has given an adjective to our language--we call an
-impracticable scheme Utopian.  Yet, under the veil of a playful fiction,
-the talk is intensely earnest, and abounds in practical suggestion.  It
-is the work of a scholarly and witty Englishman, who attacks in his own
-way the chief political and social evils of his time.  Beginning with
-fact, More tells how he was sent into Flanders with Cuthbert Tunstal,
-"whom the king's majesty of late, to the great rejoicing of all men, did
-prefer to the office of Master of the Rolls;" how the commissioners of
-Charles met them at Bruges, and presently returned to Brussels for
-instructions; and how More then went to Antwerp, where he found a
-pleasure in the society of Peter Giles which soothed his desire to see
-again his wife and children, from whom he had been four months away.  Then
-fact slides into fiction with the finding of Raphael Hythloday (whose
-name, made of two Greek words [Greek text] and [Greek text], means
-"knowing in trifles"), a man who had been with Amerigo Vespucci in the
-three last of the voyages to the new world lately discovered, of which
-the account had been first printed in 1507, only nine years before Utopia
-was written.
-
-Designedly fantastic in suggestion of details, "Utopia" is the work of a
-scholar who had read Plato's "Republic," and had his fancy quickened
-after reading Plutarch's account of Spartan life under Lycurgus.  Beneath
-the veil of an ideal communism, into which there has been worked some
-witty extravagance, there lies a noble English argument.  Sometimes More
-puts the case as of France when he means England.  Sometimes there is
-ironical praise of the good faith of Christian kings, saving the book
-from censure as a political attack on the policy of Henry VIII.  Erasmus
-wrote to a friend in 1517 that he should send for More's "Utopia," if he
-had not read it, and "wished to see the true source of all political
-evils."  And to More Erasmus wrote of his book, "A burgomaster of Antwerp
-is so pleased with it that he knows it all by heart."
-
-H. M.
-
-
-
-
-DISCOURSES OF RAPHAEL HYTHLODAY, OF THE BEST STATE OF A COMMONWEALTH
-
-
-Henry VIII., the unconquered King of England, a prince adorned with all
-the virtues that become a great monarch, having some differences of no
-small consequence with Charles the most serene Prince of Castile, sent me
-into Flanders, as his ambassador, for treating and composing matters
-between them.  I was colleague and companion to that incomparable man
-Cuthbert Tonstal, whom the King, with such universal applause, lately
-made Master of the Rolls; but of whom I will say nothing; not because I
-fear that the testimony of a friend will be suspected, but rather because
-his learning and virtues are too great for me to do them justice, and so
-well known, that they need not my commendations, unless I would,
-according to the proverb, "Show the sun with a lantern."  Those that were
-appointed by the Prince to treat with us, met us at Bruges, according to
-agreement; they were all worthy men.  The Margrave of Bruges was their
-head, and the chief man among them; but he that was esteemed the wisest,
-and that spoke for the rest, was George Temse, the Provost of Casselsee:
-both art and nature had concurred to make him eloquent: he was very
-learned in the law; and, as he had a great capacity, so, by a long
-practice in affairs, he was very dexterous at unravelling them.  After we
-had several times met, without coming to an agreement, they went to
-Brussels for some days, to know the Prince's pleasure; and, since our
-business would admit it, I went to Antwerp.  While I was there, among
-many that visited me, there was one that was more acceptable to me than
-any other, Peter Giles, born at Antwerp, who is a man of great honour,
-and of a good rank in his town, though less than he deserves; for I do
-not know if there be anywhere to be found a more learned and a better
-bred young man; for as he is both a very worthy and a very knowing
-person, so he is so civil to all men, so particularly kind to his
-friends, and so full of candour and affection, that there is not,
-perhaps, above one or two anywhere to be found, that is in all respects
-so perfect a friend: he is extraordinarily modest, there is no artifice
-in him, and yet no man has more of a prudent simplicity.  His
-conversation was so pleasant and so innocently cheerful, that his company
-in a great measure lessened any longings to go back to my country, and to
-my wife and children, which an absence of four months had quickened very
-much.  One day, as I was returning home from mass at St. Mary's, which is
-the chief church, and the most frequented of any in Antwerp, I saw him,
-by accident, talking with a stranger, who seemed past the flower of his
-age; his face was tanned, he had a long beard, and his cloak was hanging
-carelessly about him, so that, by his looks and habit, I concluded he was
-a seaman.  As soon as Peter saw me, he came and saluted me, and as I was
-returning his civility, he took me aside, and pointing to him with whom
-he had been discoursing, he said, "Do you see that man?  I was just
-thinking to bring him to you."  I answered, "He should have been very
-welcome on your account."  "And on his own too," replied he, "if you knew
-the man, for there is none alive that can give so copious an account of
-unknown nations and countries as he can do, which I know you very much
-desire."  "Then," said I, "I did not guess amiss, for at first sight I
-took him for a seaman."  "But you are much mistaken," said he, "for he
-has not sailed as a seaman, but as a traveller, or rather a philosopher.
-This Raphael, who from his family carries the name of Hythloday, is not
-ignorant of the Latin tongue, but is eminently learned in the Greek,
-having applied himself more particularly to that than to the former,
-because he had given himself much to philosophy, in which he knew that
-the Romans have left us nothing that is valuable, except what is to be
-found in Seneca and Cicero.  He is a Portuguese by birth, and was so
-desirous of seeing the world, that he divided his estate among his
-brothers, ran the same hazard as Americus Vesputius, and bore a share in
-three of his four voyages that are now published; only he did not return
-with him in his last, but obtained leave of him, almost by force, that he
-might be one of those twenty-four who were left at the farthest place at
-which they touched in their last voyage to New Castile.  The leaving him
-thus did not a little gratify one that was more fond of travelling than
-of returning home to be buried in his own country; for he used often to
-say, that the way to heaven was the same from all places, and he that had
-no grave had the heavens still over him.  Yet this disposition of mind
-had cost him dear, if God had not been very gracious to him; for after
-he, with five Castalians, had travelled over many countries, at last, by
-strange good fortune, he got to Ceylon, and from thence to Calicut, where
-he, very happily, found some Portuguese ships; and, beyond all men's
-expectations, returned to his native country."  When Peter had said this
-to me, I thanked him for his kindness in intending to give me the
-acquaintance of a man whose conversation he knew would be so acceptable;
-and upon that Raphael and I embraced each other.  After those civilities
-were past which are usual with strangers upon their first meeting, we all
-went to my house, and entering into the garden, sat down on a green bank
-and entertained one another in discourse.  He told us that when Vesputius
-had sailed away, he, and his companions that stayed behind in New
-Castile, by degrees insinuated themselves into the affections of the
-people of the country, meeting often with them and treating them gently;
-and at last they not only lived among them without danger, but conversed
-familiarly with them, and got so far into the heart of a prince, whose
-name and country I have forgot, that he both furnished them plentifully
-with all things necessary, and also with the conveniences of travelling,
-both boats when they went by water, and waggons when they trained over
-land: he sent with them a very faithful guide, who was to introduce and
-recommend them to such other princes as they had a mind to see: and after
-many days' journey, they came to towns, and cities, and to commonwealths,
-that were both happily governed and well peopled.  Under the equator, and
-as far on both sides of it as the sun moves, there lay vast deserts that
-were parched with the perpetual heat of the sun; the soil was withered,
-all things looked dismally, and all places were either quite uninhabited,
-or abounded with wild beasts and serpents, and some few men, that were
-neither less wild nor less cruel than the beasts themselves.  But, as
-they went farther, a new scene opened, all things grew milder, the air
-less burning, the soil more verdant, and even the beasts were less wild:
-and, at last, there were nations, towns, and cities, that had not only
-mutual commerce among themselves and with their neighbours, but traded,
-both by sea and land, to very remote countries.  There they found the
-conveniencies of seeing many countries on all hands, for no ship went any
-voyage into which he and his companions were not very welcome.  The first
-vessels that they saw were flat-bottomed, their sails were made of reeds
-and wicker, woven close together, only some were of leather; but,
-afterwards, they found ships made with round keels and canvas sails, and
-in all respects like our ships, and the seamen understood both astronomy
-and navigation.  He got wonderfully into their favour by showing them the
-use of the needle, of which till then they were utterly ignorant.  They
-sailed before with great caution, and only in summer time; but now they
-count all seasons alike, trusting wholly to the loadstone, in which they
-are, perhaps, more secure than safe; so that there is reason to fear that
-this discovery, which was thought would prove so much to their advantage,
-may, by their imprudence, become an occasion of much mischief to them.
-But it were too long to dwell on all that he told us he had observed in
-every place, it would be too great a digression from our present purpose:
-whatever is necessary to be told concerning those wise and prudent
-institutions which he observed among civilised nations, may perhaps be
-related by us on a more proper occasion.  We asked him many questions
-concerning all these things, to which he answered very willingly; we made
-no inquiries after monsters, than which nothing is more common; for
-everywhere one may hear of ravenous dogs and wolves, and cruel
-men-eaters, but it is not so easy to find states that are well and wisely
-governed.
-
-As he told us of many things that were amiss in those new-discovered
-countries, so he reckoned up not a few things, from which patterns might
-be taken for correcting the errors of these nations among whom we live;
-of which an account may be given, as I have already promised, at some
-other time; for, at present, I intend only to relate those particulars
-that he told us, of the manners and laws of the Utopians: but I will
-begin with the occasion that led us to speak of that commonwealth.  After
-Raphael had discoursed with great judgment on the many errors that were
-both among us and these nations, had treated of the wise institutions
-both here and there, and had spoken as distinctly of the customs and
-government of every nation through which he had past, as if he had spent
-his whole life in it, Peter, being struck with admiration, said, "I
-wonder, Raphael, how it comes that you enter into no king's service, for
-I am sure there are none to whom you would not be very acceptable; for
-your learning and knowledge, both of men and things, is such, that you
-would not only entertain them very pleasantly, but be of great use to
-them, by the examples you could set before them, and the advices you
-could give them; and by this means you would both serve your own
-interest, and be of great use to all your friends."  "As for my friends,"
-answered he, "I need not be much concerned, having already done for them
-all that was incumbent on me; for when I was not only in good health, but
-fresh and young, I distributed that among my kindred and friends which
-other people do not part with till they are old and sick: when they then
-unwillingly give that which they can enjoy no longer themselves.  I think
-my friends ought to rest contented with this, and not to expect that for
-their sakes I should enslave myself to any king whatsoever."  "Soft and
-fair!" said Peter; "I do not mean that you should be a slave to any king,
-but only that you should assist them and be useful to them."  "The change
-of the word," said he, "does not alter the matter."  "But term it as you
-will," replied Peter, "I do not see any other way in which you can be so
-useful, both in private to your friends and to the public, and by which
-you can make your own condition happier."  "Happier?" answered Raphael,
-"is that to be compassed in a way so abhorrent to my genius?  Now I live
-as I will, to which I believe, few courtiers can pretend; and there are
-so many that court the favour of great men, that there will be no great
-loss if they are not troubled either with me or with others of my
-temper."  Upon this, said I, "I perceive, Raphael, that you neither
-desire wealth nor greatness; and, indeed, I value and admire such a man
-much more than I do any of the great men in the world.  Yet I think you
-would do what would well become so generous and philosophical a soul as
-yours is, if you would apply your time and thoughts to public affairs,
-even though you may happen to find it a little uneasy to yourself; and
-this you can never do with so much advantage as by being taken into the
-council of some great prince and putting him on noble and worthy actions,
-which I know you would do if you were in such a post; for the springs
-both of good and evil flow from the prince over a whole nation, as from a
-lasting fountain.  So much learning as you have, even without practice in
-affairs, or so great a practice as you have had, without any other
-learning, would render you a very fit counsellor to any king whatsoever."
-"You are doubly mistaken," said he, "Mr. More, both in your opinion of me
-and in the judgment you make of things: for as I have not that capacity
-that you fancy I have, so if I had it, the public would not be one jot
-the better when I had sacrificed my quiet to it.  For most princes apply
-themselves more to affairs of war than to the useful arts of peace; and
-in these I neither have any knowledge, nor do I much desire it; they are
-generally more set on acquiring new kingdoms, right or wrong, than on
-governing well those they possess: and, among the ministers of princes,
-there are none that are not so wise as to need no assistance, or at
-least, that do not think themselves so wise that they imagine they need
-none; and if they court any, it is only those for whom the prince has
-much personal favour, whom by their fawning and flatteries they endeavour
-to fix to their own interests; and, indeed, nature has so made us, that
-we all love to be flattered and to please ourselves with our own notions:
-the old crow loves his young, and the ape her cubs.  Now if in such a
-court, made up of persons who envy all others and only admire themselves,
-a person should but propose anything that he had either read in history
-or observed in his travels, the rest would think that the reputation of
-their wisdom would sink, and that their interests would be much depressed
-if they could not run it down: and, if all other things failed, then they
-would fly to this, that such or such things pleased our ancestors, and it
-were well for us if we could but match them.  They would set up their
-rest on such an answer, as a sufficient confutation of all that could be
-said, as if it were a great misfortune that any should be found wiser
-than his ancestors.  But though they willingly let go all the good things
-that were among those of former ages, yet, if better things are proposed,
-they cover themselves obstinately with this excuse of reverence to past
-times.  I have met with these proud, morose, and absurd judgments of
-things in many places, particularly once in England."  "Were you ever
-there?" said I.  "Yes, I was," answered he, "and stayed some months
-there, not long after the rebellion in the West was suppressed, with a
-great slaughter of the poor people that were engaged in it.
-
-"I was then much obliged to that reverend prelate, John Morton,
-Archbishop of Canterbury, Cardinal, and Chancellor of England; a man,"
-said he, "Peter (for Mr. More knows well what he was), that was not less
-venerable for his wisdom and virtues than for the high character he bore:
-he was of a middle stature, not broken with age; his looks begot
-reverence rather than fear; his conversation was easy, but serious and
-grave; he sometimes took pleasure to try the force of those that came as
-suitors to him upon business by speaking sharply, though decently, to
-them, and by that he discovered their spirit and presence of mind; with
-which he was much delighted when it did not grow up to impudence, as
-bearing a great resemblance to his own temper, and he looked on such
-persons as the fittest men for affairs.  He spoke both gracefully and
-weightily; he was eminently skilled in the law, had a vast understanding,
-and a prodigious memory; and those excellent talents with which nature
-had furnished him were improved by study and experience.  When I was in
-England the King depended much on his counsels, and the Government seemed
-to be chiefly supported by him; for from his youth he had been all along
-practised in affairs; and, having passed through many traverses of
-fortune, he had, with great cost, acquired a vast stock of wisdom, which
-is not soon lost when it is purchased so dear.  One day, when I was
-dining with him, there happened to be at table one of the English
-lawyers, who took occasion to run out in a high commendation of the
-severe execution of justice upon thieves, 'who,' as he said, 'were then
-hanged so fast that there were sometimes twenty on one gibbet!' and, upon
-that, he said, 'he could not wonder enough how it came to pass that,
-since so few escaped, there were yet so many thieves left, who were still
-robbing in all places.'  Upon this, I (who took the boldness to speak
-freely before the Cardinal) said, 'There was no reason to wonder at the
-matter, since this way of punishing thieves was neither just in itself
-nor good for the public; for, as the severity was too great, so the
-remedy was not effectual; simple theft not being so great a crime that it
-ought to cost a man his life; no punishment, how severe soever, being
-able to restrain those from robbing who can find out no other way of
-livelihood.  In this,' said I, 'not only you in England, but a great part
-of the world, imitate some ill masters, that are readier to chastise
-their scholars than to teach them.  There are dreadful punishments
-enacted against thieves, but it were much better to make such good
-provisions by which every man might be put in a method how to live, and
-so be preserved from the fatal necessity of stealing and of dying for
-it.'  'There has been care enough taken for that,' said he; 'there are
-many handicrafts, and there is husbandry, by which they may make a shift
-to live, unless they have a greater mind to follow ill courses.'  'That
-will not serve your turn,' said I, 'for many lose their limbs in civil or
-foreign wars, as lately in the Cornish rebellion, and some time ago in
-your wars with France, who, being thus mutilated in the service of their
-king and country, can no more follow their old trades, and are too old to
-learn new ones; but since wars are only accidental things, and have
-intervals, let us consider those things that fall out every day.  There
-is a great number of noblemen among you that are themselves as idle as
-drones, that subsist on other men's labour, on the labour of their
-tenants, whom, to raise their revenues, they pare to the quick.  This,
-indeed, is the only instance of their frugality, for in all other things
-they are prodigal, even to the beggaring of themselves; but, besides
-this, they carry about with them a great number of idle fellows, who
-never learned any art by which they may gain their living; and these, as
-soon as either their lord dies, or they themselves fall sick, are turned
-out of doors; for your lords are readier to feed idle people than to take
-care of the sick; and often the heir is not able to keep together so
-great a family as his predecessor did.  Now, when the stomachs of those
-that are thus turned out of doors grow keen, they rob no less keenly; and
-what else can they do?  For when, by wandering about, they have worn out
-both their health and their clothes, and are tattered, and look ghastly,
-men of quality will not entertain them, and poor men dare not do it,
-knowing that one who has been bred up in idleness and pleasure, and who
-was used to walk about with his sword and buckler, despising all the
-neighbourhood with an insolent scorn as far below him, is not fit for the
-spade and mattock; nor will he serve a poor man for so small a hire and
-in so low a diet as he can afford to give him.'  To this he answered,
-'This sort of men ought to be particularly cherished, for in them
-consists the force of the armies for which we have occasion; since their
-birth inspires them with a nobler sense of honour than is to be found
-among tradesmen or ploughmen.'  'You may as well say,' replied I, 'that
-you must cherish thieves on the account of wars, for you will never want
-the one as long as you have the other; and as robbers prove sometimes
-gallant soldiers, so soldiers often prove brave robbers, so near an
-alliance there is between those two sorts of life.  But this bad custom,
-so common among you, of keeping many servants, is not peculiar to this
-nation.  In France there is yet a more pestiferous sort of people, for
-the whole country is full of soldiers, still kept up in time of peace (if
-such a state of a nation can be called a peace); and these are kept in
-pay upon the same account that you plead for those idle retainers about
-noblemen: this being a maxim of those pretended statesmen, that it is
-necessary for the public safety to have a good body of veteran soldiers
-ever in readiness.  They think raw men are not to be depended on, and
-they sometimes seek occasions for making war, that they may train up
-their soldiers in the art of cutting throats, or, as Sallust observed,
-"for keeping their hands in use, that they may not grow dull by too long
-an intermission."  But France has learned to its cost how dangerous it is
-to feed such beasts.  The fate of the Romans, Carthaginians, and Syrians,
-and many other nations and cities, which were both overturned and quite
-ruined by those standing armies, should make others wiser; and the folly
-of this maxim of the French appears plainly even from this, that their
-trained soldiers often find your raw men prove too hard for them, of
-which I will not say much, lest you may think I flatter the English.
-Every day's experience shows that the mechanics in the towns or the
-clowns in the country are not afraid of fighting with those idle
-gentlemen, if they are not disabled by some misfortune in their body or
-dispirited by extreme want; so that you need not fear that those well-
-shaped and strong men (for it is only such that noblemen love to keep
-about them till they spoil them), who now grow feeble with ease and are
-softened with their effeminate manner of life, would be less fit for
-action if they were well bred and well employed.  And it seems very
-unreasonable that, for the prospect of a war, which you need never have
-but when you please, you should maintain so many idle men, as will always
-disturb you in time of peace, which is ever to be more considered than
-war.  But I do not think that this necessity of stealing arises only from
-hence; there is another cause of it, more peculiar to England.'  'What is
-that?' said the Cardinal: 'The increase of pasture,' said I, 'by which
-your sheep, which are naturally mild, and easily kept in order, may be
-said now to devour men and unpeople, not only villages, but towns; for
-wherever it is found that the sheep of any soil yield a softer and richer
-wool than ordinary, there the nobility and gentry, and even those holy
-men, the dobots! not contented with the old rents which their farms
-yielded, nor thinking it enough that they, living at their ease, do no
-good to the public, resolve to do it hurt instead of good.  They stop the
-course of agriculture, destroying houses and towns, reserving only the
-churches, and enclose grounds that they may lodge their sheep in them.  As
-if forests and parks had swallowed up too little of the land, those
-worthy countrymen turn the best inhabited places into solitudes; for when
-an insatiable wretch, who is a plague to his country, resolves to enclose
-many thousand acres of ground, the owners, as well as tenants, are turned
-out of their possessions by trick or by main force, or, being wearied out
-by ill usage, they are forced to sell them; by which means those
-miserable people, both men and women, married and unmarried, old and
-young, with their poor but numerous families (since country business
-requires many hands), are all forced to change their seats, not knowing
-whither to go; and they must sell, almost for nothing, their household
-stuff, which could not bring them much money, even though they might stay
-for a buyer.  When that little money is at an end (for it will be soon
-spent), what is left for them to do but either to steal, and so to be
-hanged (God knows how justly!), or to go about and beg? and if they do
-this they are put in prison as idle vagabonds, while they would willingly
-work but can find none that will hire them; for there is no more occasion
-for country labour, to which they have been bred, when there is no arable
-ground left.  One shepherd can look after a flock, which will stock an
-extent of ground that would require many hands if it were to be ploughed
-and reaped.  This, likewise, in many places raises the price of corn.  The
-price of wool is also so risen that the poor people, who were wont to
-make cloth, are no more able to buy it; and this, likewise, makes many of
-them idle: for since the increase of pasture God has punished the avarice
-of the owners by a rot among the sheep, which has destroyed vast numbers
-of them--to us it might have seemed more just had it fell on the owners
-themselves.  But, suppose the sheep should increase ever so much, their
-price is not likely to fall; since, though they cannot be called a
-monopoly, because they are not engrossed by one person, yet they are in
-so few hands, and these are so rich, that, as they are not pressed to
-sell them sooner than they have a mind to it, so they never do it till
-they have raised the price as high as possible.  And on the same account
-it is that the other kinds of cattle are so dear, because many villages
-being pulled down, and all country labour being much neglected, there are
-none who make it their business to breed them.  The rich do not breed
-cattle as they do sheep, but buy them lean and at low prices; and, after
-they have fattened them on their grounds, sell them again at high rates.
-And I do not think that all the inconveniences this will produce are yet
-observed; for, as they sell the cattle dear, so, if they are consumed
-faster than the breeding countries from which they are brought can afford
-them, then the stock must decrease, and this must needs end in great
-scarcity; and by these means, this your island, which seemed as to this
-particular the happiest in the world, will suffer much by the cursed
-avarice of a few persons: besides this, the rising of corn makes all
-people lessen their families as much as they can; and what can those who
-are dismissed by them do but either beg or rob?  And to this last a man
-of a great mind is much sooner drawn than to the former.  Luxury likewise
-breaks in apace upon you to set forward your poverty and misery; there is
-an excessive vanity in apparel, and great cost in diet, and that not only
-in noblemen's families, but even among tradesmen, among the farmers
-themselves, and among all ranks of persons.  You have also many infamous
-houses, and, besides those that are known, the taverns and ale-houses are
-no better; add to these dice, cards, tables, football, tennis, and
-quoits, in which money runs fast away; and those that are initiated into
-them must, in the conclusion, betake themselves to robbing for a supply.
-Banish these plagues, and give orders that those who have dispeopled so
-much soil may either rebuild the villages they have pulled down or let
-out their grounds to such as will do it; restrain those engrossings of
-the rich, that are as bad almost as monopolies; leave fewer occasions to
-idleness; let agriculture be set up again, and the manufacture of the
-wool be regulated, that so there may be work found for those companies of
-idle people whom want forces to be thieves, or who now, being idle
-vagabonds or useless servants, will certainly grow thieves at last.  If
-you do not find a remedy to these evils it is a vain thing to boast of
-your severity in punishing theft, which, though it may have the
-appearance of justice, yet in itself is neither just nor convenient; for
-if you suffer your people to be ill-educated, and their manners to be
-corrupted from their infancy, and then punish them for those crimes to
-which their first education disposed them, what else is to be concluded
-from this but that you first make thieves and then punish them?'
-
-"While I was talking thus, the Counsellor, who was present, had prepared
-an answer, and had resolved to resume all I had said, according to the
-formality of a debate, in which things are generally repeated more
-faithfully than they are answered, as if the chief trial to be made were
-of men's memories.  'You have talked prettily, for a stranger,' said he,
-'having heard of many things among us which you have not been able to
-consider well; but I will make the whole matter plain to you, and will
-first repeat in order all that you have said; then I will show how much
-your ignorance of our affairs has misled you; and will, in the last
-place, answer all your arguments.  And, that I may begin where I
-promised, there were four things--'  'Hold your peace!' said the
-Cardinal; 'this will take up too much time; therefore we will, at
-present, ease you of the trouble of answering, and reserve it to our next
-meeting, which shall be to-morrow, if Raphael's affairs and yours can
-admit of it.  But, Raphael,' said he to me, 'I would gladly know upon
-what reason it is that you think theft ought not to be punished by death:
-would you give way to it? or do you propose any other punishment that
-will be more useful to the public? for, since death does not restrain
-theft, if men thought their lives would be safe, what fear or force could
-restrain ill men?  On the contrary, they would look on the mitigation of
-the punishment as an invitation to commit more crimes.'  I answered, 'It
-seems to me a very unjust thing to take away a man's life for a little
-money, for nothing in the world can be of equal value with a man's life:
-and if it be said, "that it is not for the money that one suffers, but
-for his breaking the law," I must say, extreme justice is an extreme
-injury: for we ought not to approve of those terrible laws that make the
-smallest offences capital, nor of that opinion of the Stoics that makes
-all crimes equal; as if there were no difference to be made between the
-killing a man and the taking his purse, between which, if we examine
-things impartially, there is no likeness nor proportion.  God has
-commanded us not to kill, and shall we kill so easily for a little money?
-But if one shall say, that by that law we are only forbid to kill any
-except when the laws of the land allow of it, upon the same grounds, laws
-may be made, in some cases, to allow of adultery and perjury: for God
-having taken from us the right of disposing either of our own or of other
-people's lives, if it is pretended that the mutual consent of men in
-making laws can authorise man-slaughter in cases in which God has given
-us no example, that it frees people from the obligation of the divine
-law, and so makes murder a lawful action, what is this, but to give a
-preference to human laws before the divine? and, if this is once
-admitted, by the same rule men may, in all other things, put what
-restrictions they please upon the laws of God.  If, by the Mosaical law,
-though it was rough and severe, as being a yoke laid on an obstinate and
-servile nation, men were only fined, and not put to death for theft, we
-cannot imagine, that in this new law of mercy, in which God treats us
-with the tenderness of a father, He has given us a greater licence to
-cruelty than He did to the Jews.  Upon these reasons it is, that I think
-putting thieves to death is not lawful; and it is plain and obvious that
-it is absurd and of ill consequence to the commonwealth that a thief and
-a murderer should be equally punished; for if a robber sees that his
-danger is the same if he is convicted of theft as if he were guilty of
-murder, this will naturally incite him to kill the person whom otherwise
-he would only have robbed; since, if the punishment is the same, there is
-more security, and less danger of discovery, when he that can best make
-it is put out of the way; so that terrifying thieves too much provokes
-them to cruelty.
-
-"But as to the question, 'What more convenient way of punishment can be
-found?' I think it much easier to find out that than to invent anything
-that is worse; why should we doubt but the way that was so long in use
-among the old Romans, who understood so well the arts of government, was
-very proper for their punishment?  They condemned such as they found
-guilty of great crimes to work their whole lives in quarries, or to dig
-in mines with chains about them.  But the method that I liked best was
-that which I observed in my travels in Persia, among the Polylerits, who
-are a considerable and well-governed people: they pay a yearly tribute to
-the King of Persia, but in all other respects they are a free nation, and
-governed by their own laws: they lie far from the sea, and are environed
-with hills; and, being contented with the productions of their own
-country, which is very fruitful, they have little commerce with any other
-nation; and as they, according to the genius of their country, have no
-inclination to enlarge their borders, so their mountains and the pension
-they pay to the Persian, secure them from all invasions.  Thus they have
-no wars among them; they live rather conveniently than with splendour,
-and may be rather called a happy nation than either eminent or famous;
-for I do not think that they are known, so much as by name, to any but
-their next neighbours.  Those that are found guilty of theft among them
-are bound to make restitution to the owner, and not, as it is in other
-places, to the prince, for they reckon that the prince has no more right
-to the stolen goods than the thief; but if that which was stolen is no
-more in being, then the goods of the thieves are estimated, and
-restitution being made out of them, the remainder is given to their wives
-and children; and they themselves are condemned to serve in the public
-works, but are neither imprisoned nor chained, unless there happens to be
-some extraordinary circumstance in their crimes.  They go about loose and
-free, working for the public: if they are idle or backward to work they
-are whipped, but if they work hard they are well used and treated without
-any mark of reproach; only the lists of them are called always at night,
-and then they are shut up.  They suffer no other uneasiness but this of
-constant labour; for, as they work for the public, so they are well
-entertained out of the public stock, which is done differently in
-different places: in some places whatever is bestowed on them is raised
-by a charitable contribution; and, though this way may seem uncertain,
-yet so merciful are the inclinations of that people, that they are
-plentifully supplied by it; but in other places public revenues are set
-aside for them, or there is a constant tax or poll-money raised for their
-maintenance.  In some places they are set to no public work, but every
-private man that has occasion to hire workmen goes to the market-places
-and hires them of the public, a little lower than he would do a freeman.
-If they go lazily about their task he may quicken them with the whip.  By
-this means there is always some piece of work or other to be done by
-them; and, besides their livelihood, they earn somewhat still to the
-public.  They all wear a peculiar habit, of one certain colour, and their
-hair is cropped a little above their ears, and a piece of one of their
-ears is cut off.  Their friends are allowed to give them either meat,
-drink, or clothes, so they are of their proper colour; but it is death,
-both to the giver and taker, if they give them money; nor is it less
-penal for any freeman to take money from them upon any account
-whatsoever: and it is also death for any of these slaves (so they are
-called) to handle arms.  Those of every division of the country are
-distinguished by a peculiar mark, which it is capital for them to lay
-aside, to go out of their bounds, or to talk with a slave of another
-jurisdiction, and the very attempt of an escape is no less penal than an
-escape itself.  It is death for any other slave to be accessory to it;
-and if a freeman engages in it he is condemned to slavery.  Those that
-discover it are rewarded--if freemen, in money; and if slaves, with
-liberty, together with a pardon for being accessory to it; that so they
-might find their account rather in repenting of their engaging in such a
-design than in persisting in it.
-
-"These are their laws and rules in relation to robbery, and it is obvious
-that they are as advantageous as they are mild and gentle; since vice is
-not only destroyed and men preserved, but they are treated in such a
-manner as to make them see the necessity of being honest and of employing
-the rest of their lives in repairing the injuries they had formerly done
-to society.  Nor is there any hazard of their falling back to their old
-customs; and so little do travellers apprehend mischief from them that
-they generally make use of them for guides from one jurisdiction to
-another; for there is nothing left them by which they can rob or be the
-better for it, since, as they are disarmed, so the very having of money
-is a sufficient conviction: and as they are certainly punished if
-discovered, so they cannot hope to escape; for their habit being in all
-the parts of it different from what is commonly worn, they cannot fly
-away, unless they would go naked, and even then their cropped ear would
-betray them.  The only danger to be feared from them is their conspiring
-against the government; but those of one division and neighbourhood can
-do nothing to any purpose unless a general conspiracy were laid amongst
-all the slaves of the several jurisdictions, which cannot be done, since
-they cannot meet or talk together; nor will any venture on a design where
-the concealment would be so dangerous and the discovery so profitable.
-None are quite hopeless of recovering their freedom, since by their
-obedience and patience, and by giving good grounds to believe that they
-will change their manner of life for the future, they may expect at last
-to obtain their liberty, and some are every year restored to it upon the
-good character that is given of them.  When I had related all this, I
-added that I did not see why such a method might not be followed with
-more advantage than could ever be expected from that severe justice which
-the Counsellor magnified so much.  To this he answered, 'That it could
-never take place in England without endangering the whole nation.'  As he
-said this he shook his head, made some grimaces, and held his peace,
-while all the company seemed of his opinion, except the Cardinal, who
-said, 'That it was not easy to form a judgment of its success, since it
-was a method that never yet had been tried; but if,' said he, 'when
-sentence of death were passed upon a thief, the prince would reprieve him
-for a while, and make the experiment upon him, denying him the privilege
-of a sanctuary; and then, if it had a good effect upon him, it might take
-place; and, if it did not succeed, the worst would be to execute the
-sentence on the condemned persons at last; and I do not see,' added he,
-'why it would be either unjust, inconvenient, or at all dangerous to
-admit of such a delay; in my opinion the vagabonds ought to be treated in
-the same manner, against whom, though we have made many laws, yet we have
-not been able to gain our end.'  When the Cardinal had done, they all
-commended the motion, though they had despised it when it came from me,
-but more particularly commended what related to the vagabonds, because it
-was his own observation.
-
-"I do not know whether it be worth while to tell what followed, for it
-was very ridiculous; but I shall venture at it, for as it is not foreign
-to this matter, so some good use may be made of it.  There was a Jester
-standing by, that counterfeited the fool so naturally that he seemed to
-be really one; the jests which he offered were so cold and dull that we
-laughed more at him than at them, yet sometimes he said, as it were by
-chance, things that were not unpleasant, so as to justify the old
-proverb, 'That he who throws the dice often, will sometimes have a lucky
-hit.'  When one of the company had said that I had taken care of the
-thieves, and the Cardinal had taken care of the vagabonds, so that there
-remained nothing but that some public provision might be made for the
-poor whom sickness or old age had disabled from labour, 'Leave that to
-me,' said the Fool, 'and I shall take care of them, for there is no sort
-of people whose sight I abhor more, having been so often vexed with them
-and with their sad complaints; but as dolefully soever as they have told
-their tale, they could never prevail so far as to draw one penny from me;
-for either I had no mind to give them anything, or, when I had a mind to
-do it, I had nothing to give them; and they now know me so well that they
-will not lose their labour, but let me pass without giving me any
-trouble, because they hope for nothing--no more, in faith, than if I were
-a priest; but I would have a law made for sending all these beggars to
-monasteries, the men to the Benedictines, to be made lay-brothers, and
-the women to be nuns.'  The Cardinal smiled, and approved of it in jest,
-but the rest liked it in earnest.  There was a divine present, who,
-though he was a grave morose man, yet he was so pleased with this
-reflection that was made on the priests and the monks that he began to
-play with the Fool, and said to him, 'This will not deliver you from all
-beggars, except you take care of us Friars.'  'That is done already,'
-answered the Fool, 'for the Cardinal has provided for you by what he
-proposed for restraining vagabonds and setting them to work, for I know
-no vagabonds like you.'  This was well entertained by the whole company,
-who, looking at the Cardinal, perceived that he was not ill-pleased at
-it; only the Friar himself was vexed, as may be easily imagined, and fell
-into such a passion that he could not forbear railing at the Fool, and
-calling him knave, slanderer, backbiter, and son of perdition, and then
-cited some dreadful threatenings out of the Scriptures against him.  Now
-the Jester thought he was in his element, and laid about him freely.
-'Good Friar,' said he, 'be not angry, for it is written, "In patience
-possess your soul."'  The Friar answered (for I shall give you his own
-words), 'I am not angry, you hangman; at least, I do not sin in it, for
-the Psalmist says, "Be ye angry and sin not."'  Upon this the Cardinal
-admonished him gently, and wished him to govern his passions.  'No, my
-lord,' said he, 'I speak not but from a good zeal, which I ought to have,
-for holy men have had a good zeal, as it is said, "The zeal of thy house
-hath eaten me up;" and we sing in our church that those who mocked Elisha
-as he went up to the house of God felt the effects of his zeal, which
-that mocker, that rogue, that scoundrel, will perhaps feel.'  'You do
-this, perhaps, with a good intention,' said the Cardinal, 'but, in my
-opinion, it were wiser in you, and perhaps better for you, not to engage
-in so ridiculous a contest with a Fool.'  'No, my lord,' answered he,
-'that were not wisely done, for Solomon, the wisest of men, said, "Answer
-a Fool according to his folly," which I now do, and show him the ditch
-into which he will fall, if he is not aware of it; for if the many
-mockers of Elisha, who was but one bald man, felt the effect of his zeal,
-what will become of the mocker of so many Friars, among whom there are so
-many bald men?  We have, likewise, a bull, by which all that jeer us are
-excommunicated.'  When the Cardinal saw that there was no end of this
-matter he made a sign to the Fool to withdraw, turned the discourse
-another way, and soon after rose from the table, and, dismissing us, went
-to hear causes.
-
-"Thus, Mr. More, I have run out into a tedious story, of the length of
-which I had been ashamed, if (as you earnestly begged it of me) I had not
-observed you to hearken to it as if you had no mind to lose any part of
-it.  I might have contracted it, but I resolved to give it you at large,
-that you might observe how those that despised what I had proposed, no
-sooner perceived that the Cardinal did not dislike it but presently
-approved of it, fawned so on him and flattered him to such a degree, that
-they in good earnest applauded those things that he only liked in jest;
-and from hence you may gather how little courtiers would value either me
-or my counsels."
-
-To this I answered, "You have done me a great kindness in this relation;
-for as everything has been related by you both wisely and pleasantly, so
-you have made me imagine that I was in my own country and grown young
-again, by recalling that good Cardinal to my thoughts, in whose family I
-was bred from my childhood; and though you are, upon other accounts, very
-dear to me, yet you are the dearer because you honour his memory so much;
-but, after all this, I cannot change my opinion, for I still think that
-if you could overcome that aversion which you have to the courts of
-princes, you might, by the advice which it is in your power to give, do a
-great deal of good to mankind, and this is the chief design that every
-good man ought to propose to himself in living; for your friend Plato
-thinks that nations will be happy when either philosophers become kings
-or kings become philosophers.  It is no wonder if we are so far from that
-happiness while philosophers will not think it their duty to assist kings
-with their counsels."  "They are not so base-minded," said he, "but that
-they would willingly do it; many of them have already done it by their
-books, if those that are in power would but hearken to their good advice.
-But Plato judged right, that except kings themselves became philosophers,
-they who from their childhood are corrupted with false notions would
-never fall in entirely with the counsels of philosophers, and this he
-himself found to be true in the person of Dionysius.
-
-"Do not you think that if I were about any king, proposing good laws to
-him, and endeavouring to root out all the cursed seeds of evil that I
-found in him, I should either be turned out of his court, or, at least,
-be laughed at for my pains?  For instance, what could I signify if I were
-about the King of France, and were called into his cabinet council, where
-several wise men, in his hearing, were proposing many expedients; as, by
-what arts and practices Milan may be kept, and Naples, that has so often
-slipped out of their hands, recovered; how the Venetians, and after them
-the rest of Italy, may be subdued; and then how Flanders, Brabant, and
-all Burgundy, and some other kingdoms which he has swallowed already in
-his designs, may be added to his empire?  One proposes a league with the
-Venetians, to be kept as long as he finds his account in it, and that he
-ought to communicate counsels with them, and give them some share of the
-spoil till his success makes him need or fear them less, and then it will
-be easily taken out of their hands; another proposes the hiring the
-Germans and the securing the Switzers by pensions; another proposes the
-gaining the Emperor by money, which is omnipotent with him; another
-proposes a peace with the King of Arragon, and, in order to cement it,
-the yielding up the King of Navarre's pretensions; another thinks that
-the Prince of Castile is to be wrought on by the hope of an alliance, and
-that some of his courtiers are to be gained to the French faction by
-pensions.  The hardest point of all is, what to do with England; a treaty
-of peace is to be set on foot, and, if their alliance is not to be
-depended on, yet it is to be made as firm as possible, and they are to be
-called friends, but suspected as enemies: therefore the Scots are to be
-kept in readiness to be let loose upon England on every occasion; and
-some banished nobleman is to be supported underhand (for by the League it
-cannot be done avowedly) who has a pretension to the crown, by which
-means that suspected prince may be kept in awe.  Now when things are in
-so great a fermentation, and so many gallant men are joining counsels how
-to carry on the war, if so mean a man as I should stand up and wish them
-to change all their counsels--to let Italy alone and stay at home, since
-the kingdom of France was indeed greater than could be well governed by
-one man; that therefore he ought not to think of adding others to it; and
-if, after this, I should propose to them the resolutions of the
-Achorians, a people that lie on the south-east of Utopia, who long ago
-engaged in war in order to add to the dominions of their prince another
-kingdom, to which he had some pretensions by an ancient alliance: this
-they conquered, but found that the trouble of keeping it was equal to
-that by which it was gained; that the conquered people were always either
-in rebellion or exposed to foreign invasions, while they were obliged to
-be incessantly at war, either for or against them, and consequently could
-never disband their army; that in the meantime they were oppressed with
-taxes, their money went out of the kingdom, their blood was spilt for the
-glory of their king without procuring the least advantage to the people,
-who received not the smallest benefit from it even in time of peace; and
-that, their manners being corrupted by a long war, robbery and murders
-everywhere abounded, and their laws fell into contempt; while their king,
-distracted with the care of two kingdoms, was the less able to apply his
-mind to the interest of either.  When they saw this, and that there would
-be no end to these evils, they by joint counsels made an humble address
-to their king, desiring him to choose which of the two kingdoms he had
-the greatest mind to keep, since he could not hold both; for they were
-too great a people to be governed by a divided king, since no man would
-willingly have a groom that should be in common between him and another.
-Upon which the good prince was forced to quit his new kingdom to one of
-his friends (who was not long after dethroned), and to be contented with
-his old one.  To this I would add that after all those warlike attempts,
-the vast confusions, and the consumption both of treasure and of people
-that must follow them, perhaps upon some misfortune they might be forced
-to throw up all at last; therefore it seemed much more eligible that the
-king should improve his ancient kingdom all he could, and make it
-flourish as much as possible; that he should love his people, and be
-beloved of them; that he should live among them, govern them gently and
-let other kingdoms alone, since that which had fallen to his share was
-big enough, if not too big, for him:--pray, how do you think would such a
-speech as this be heard?"
-
-"I confess," said I, "I think not very well."
-
-"But what," said he, "if I should sort with another kind of ministers,
-whose chief contrivances and consultations were by what art the prince's
-treasures might be increased? where one proposes raising the value of
-specie when the king's debts are large, and lowering it when his revenues
-were to come in, that so he might both pay much with a little, and in a
-little receive a great deal.  Another proposes a pretence of a war, that
-money might be raised in order to carry it on, and that a peace be
-concluded as soon as that was done; and this with such appearances of
-religion as might work on the people, and make them impute it to the
-piety of their prince, and to his tenderness for the lives of his
-subjects.  A third offers some old musty laws that have been antiquated
-by a long disuse (and which, as they had been forgotten by all the
-subjects, so they had also been broken by them), and proposes the levying
-the penalties of these laws, that, as it would bring in a vast treasure,
-so there might be a very good pretence for it, since it would look like
-the executing a law and the doing of justice.  A fourth proposes the
-prohibiting of many things under severe penalties, especially such as
-were against the interest of the people, and then the dispensing with
-these prohibitions, upon great compositions, to those who might find
-their advantage in breaking them.  This would serve two ends, both of
-them acceptable to many; for as those whose avarice led them to
-transgress would be severely fined, so the selling licences dear would
-look as if a prince were tender of his people, and would not easily, or
-at low rates, dispense with anything that might be against the public
-good.  Another proposes that the judges must be made sure, that they may
-declare always in favour of the prerogative; that they must be often sent
-for to court, that the king may hear them argue those points in which he
-is concerned; since, how unjust soever any of his pretensions may be, yet
-still some one or other of them, either out of contradiction to others,
-or the pride of singularity, or to make their court, would find out some
-pretence or other to give the king a fair colour to carry the point.  For
-if the judges but differ in opinion, the clearest thing in the world is
-made by that means disputable, and truth being once brought in question,
-the king may then take advantage to expound the law for his own profit;
-while the judges that stand out will be brought over, either through fear
-or modesty; and they being thus gained, all of them may be sent to the
-Bench to give sentence boldly as the king would have it; for fair
-pretences will never be wanting when sentence is to be given in the
-prince's favour.  It will either be said that equity lies of his side, or
-some words in the law will be found sounding that way, or some forced
-sense will be put on them; and, when all other things fail, the king's
-undoubted prerogative will be pretended, as that which is above all law,
-and to which a religious judge ought to have a special regard.  Thus all
-consent to that maxim of Crassus, that a prince cannot have treasure
-enough, since he must maintain his armies out of it; that a king, even
-though he would, can do nothing unjustly; that all property is in him,
-not excepting the very persons of his subjects; and that no man has any
-other property but that which the king, out of his goodness, thinks fit
-to leave him.  And they think it is the prince's interest that there be
-as little of this left as may be, as if it were his advantage that his
-people should have neither riches nor liberty, since these things make
-them less easy and willing to submit to a cruel and unjust government.
-Whereas necessity and poverty blunts them, makes them patient, beats them
-down, and breaks that height of spirit that might otherwise dispose them
-to rebel.  Now what if, after all these propositions were made, I should
-rise up and assert that such counsels were both unbecoming a king and
-mischievous to him; and that not only his honour, but his safety,
-consisted more in his people's wealth than in his own; if I should show
-that they choose a king for their own sake, and not for his; that, by his
-care and endeavours, they may be both easy and safe; and that, therefore,
-a prince ought to take more care of his people's happiness than of his
-own, as a shepherd is to take more care of his flock than of himself?  It
-is also certain that they are much mistaken that think the poverty of a
-nation is a mean of the public safety.  Who quarrel more than beggars?
-who does more earnestly long for a change than he that is uneasy in his
-present circumstances? and who run to create confusions with so desperate
-a boldness as those who, having nothing to lose, hope to gain by them?  If
-a king should fall under such contempt or envy that he could not keep his
-subjects in their duty but by oppression and ill usage, and by rendering
-them poor and miserable, it were certainly better for him to quit his
-kingdom than to retain it by such methods as make him, while he keeps the
-name of authority, lose the majesty due to it.  Nor is it so becoming the
-dignity of a king to reign over beggars as over rich and happy subjects.
-And therefore Fabricius, a man of a noble and exalted temper, said 'he
-would rather govern rich men than be rich himself; since for one man to
-abound in wealth and pleasure when all about him are mourning and
-groaning, is to be a gaoler and not a king.'  He is an unskilful
-physician that cannot cure one disease without casting his patient into
-another.  So he that can find no other way for correcting the errors of
-his people but by taking from them the conveniences of life, shows that
-he knows not what it is to govern a free nation.  He himself ought rather
-to shake off his sloth, or to lay down his pride, for the contempt or
-hatred that his people have for him takes its rise from the vices in
-himself.  Let him live upon what belongs to him without wronging others,
-and accommodate his expense to his revenue.  Let him punish crimes, and,
-by his wise conduct, let him endeavour to prevent them, rather than be
-severe when he has suffered them to be too common.  Let him not rashly
-revive laws that are abrogated by disuse, especially if they have been
-long forgotten and never wanted.  And let him never take any penalty for
-the breach of them to which a judge would not give way in a private man,
-but would look on him as a crafty and unjust person for pretending to it.
-To these things I would add that law among the Macarians--a people that
-live not far from Utopia--by which their king, on the day on which he
-began to reign, is tied by an oath, confirmed by solemn sacrifices, never
-to have at once above a thousand pounds of gold in his treasures, or so
-much silver as is equal to that in value.  This law, they tell us, was
-made by an excellent king who had more regard to the riches of his
-country than to his own wealth, and therefore provided against the
-heaping up of so much treasure as might impoverish the people.  He
-thought that moderate sum might be sufficient for any accident, if either
-the king had occasion for it against the rebels, or the kingdom against
-the invasion of an enemy; but that it was not enough to encourage a
-prince to invade other men's rights--a circumstance that was the chief
-cause of his making that law.  He also thought that it was a good
-provision for that free circulation of money so necessary for the course
-of commerce and exchange.  And when a king must distribute all those
-extraordinary accessions that increase treasure beyond the due pitch, it
-makes him less disposed to oppress his subjects.  Such a king as this
-will be the terror of ill men, and will be beloved by all the good.
-
-"If, I say, I should talk of these or such-like things to men that had
-taken their bias another way, how deaf would they be to all I could say!"
-"No doubt, very deaf," answered I; "and no wonder, for one is never to
-offer propositions or advice that we are certain will not be entertained.
-Discourses so much out of the road could not avail anything, nor have any
-effect on men whose minds were prepossessed with different sentiments.
-This philosophical way of speculation is not unpleasant among friends in
-a free conversation; but there is no room for it in the courts of
-princes, where great affairs are carried on by authority."  "That is what
-I was saying," replied he, "that there is no room for philosophy in the
-courts of princes."  "Yes, there is," said I, "but not for this
-speculative philosophy, that makes everything to be alike fitting at all
-times; but there is another philosophy that is more pliable, that knows
-its proper scene, accommodates itself to it, and teaches a man with
-propriety and decency to act that part which has fallen to his share.  If
-when one of Plautus' comedies is upon the stage, and a company of
-servants are acting their parts, you should come out in the garb of a
-philosopher, and repeat, out of _Octavia_, a discourse of Seneca's to
-Nero, would it not be better for you to say nothing than by mixing things
-of such different natures to make an impertinent tragi-comedy? for you
-spoil and corrupt the play that is in hand when you mix with it things of
-an opposite nature, even though they are much better.  Therefore go
-through with the play that is acting the best you can, and do not
-confound it because another that is pleasanter comes into your thoughts.
-It is even so in a commonwealth and in the councils of princes; if ill
-opinions cannot be quite rooted out, and you cannot cure some received
-vice according to your wishes, you must not, therefore, abandon the
-commonwealth, for the same reasons as you should not forsake the ship in
-a storm because you cannot command the winds.  You are not obliged to
-assault people with discourses that are out of their road, when you see
-that their received notions must prevent your making an impression upon
-them: you ought rather to cast about and to manage things with all the
-dexterity in your power, so that, if you are not able to make them go
-well, they may be as little ill as possible; for, except all men were
-good, everything cannot be right, and that is a blessing that I do not at
-present hope to see."  "According to your argument," answered he, "all
-that I could be able to do would be to preserve myself from being mad
-while I endeavoured to cure the madness of others; for, if I speak with,
-I must repeat what I have said to you; and as for lying, whether a
-philosopher can do it or not I cannot tell: I am sure I cannot do it.  But
-though these discourses may be uneasy and ungrateful to them, I do not
-see why they should seem foolish or extravagant; indeed, if I should
-either propose such things as Plato has contrived in his 'Commonwealth,'
-or as the Utopians practise in theirs, though they might seem better, as
-certainly they are, yet they are so different from our establishment,
-which is founded on property (there being no such thing among them), that
-I could not expect that it would have any effect on them.  But such
-discourses as mine, which only call past evils to mind and give warning
-of what may follow, leave nothing in them that is so absurd that they may
-not be used at any time, for they can only be unpleasant to those who are
-resolved to run headlong the contrary way; and if we must let alone
-everything as absurd or extravagant--which, by reason of the wicked lives
-of many, may seem uncouth--we must, even among Christians, give over
-pressing the greatest part of those things that Christ hath taught us,
-though He has commanded us not to conceal them, but to proclaim on the
-housetops that which He taught in secret.  The greatest parts of His
-precepts are more opposite to the lives of the men of this age than any
-part of my discourse has been, but the preachers seem to have learned
-that craft to which you advise me: for they, observing that the world
-would not willingly suit their lives to the rules that Christ has given,
-have fitted His doctrine, as if it had been a leaden rule, to their
-lives, that so, some way or other, they might agree with one another.  But
-I see no other effect of this compliance except it be that men become
-more secure in their wickedness by it; and this is all the success that I
-can have in a court, for I must always differ from the rest, and then I
-shall signify nothing; or, if I agree with them, I shall then only help
-forward their madness.  I do not comprehend what you mean by your
-'casting about,' or by 'the bending and handling things so dexterously
-that, if they go not well, they may go as little ill as may be;' for in
-courts they will not bear with a man's holding his peace or conniving at
-what others do: a man must barefacedly approve of the worst counsels and
-consent to the blackest designs, so that he would pass for a spy, or,
-possibly, for a traitor, that did but coldly approve of such wicked
-practices; and therefore when a man is engaged in such a society, he will
-be so far from being able to mend matters by his 'casting about,' as you
-call it, that he will find no occasions of doing any good--the ill
-company will sooner corrupt him than be the better for him; or if,
-notwithstanding all their ill company, he still remains steady and
-innocent, yet their follies and knavery will be imputed to him; and, by
-mixing counsels with them, he must bear his share of all the blame that
-belongs wholly to others.
-
-"It was no ill simile by which Plato set forth the unreasonableness of a
-philosopher's meddling with government.  'If a man,' says he, 'were to
-see a great company run out every day into the rain and take delight in
-being wet--if he knew that it would be to no purpose for him to go and
-persuade them to return to their houses in order to avoid the storm, and
-that all that could be expected by his going to speak to them would be
-that he himself should be as wet as they, it would be best for him to
-keep within doors, and, since he had not influence enough to correct
-other people's folly, to take care to preserve himself.'
-
-"Though, to speak plainly my real sentiments, I must freely own that as
-long as there is any property, and while money is the standard of all
-other things, I cannot think that a nation can be governed either justly
-or happily: not justly, because the best things will fall to the share of
-the worst men; nor happily, because all things will be divided among a
-few (and even these are not in all respects happy), the rest being left
-to be absolutely miserable.  Therefore, when I reflect on the wise and
-good constitution of the Utopians, among whom all things are so well
-governed and with so few laws, where virtue hath its due reward, and yet
-there is such an equality that every man lives in plenty--when I compare
-with them so many other nations that are still making new laws, and yet
-can never bring their constitution to a right regulation; where,
-notwithstanding every one has his property, yet all the laws that they
-can invent have not the power either to obtain or preserve it, or even to
-enable men certainly to distinguish what is their own from what is
-another's, of which the many lawsuits that every day break out, and are
-eternally depending, give too plain a demonstration--when, I say, I
-balance all these things in my thoughts, I grow more favourable to Plato,
-and do not wonder that he resolved not to make any laws for such as would
-not submit to a community of all things; for so wise a man could not but
-foresee that the setting all upon a level was the only way to make a
-nation happy; which cannot be obtained so long as there is property, for
-when every man draws to himself all that he can compass, by one title or
-another, it must needs follow that, how plentiful soever a nation may be,
-yet a few dividing the wealth of it among themselves, the rest must fall
-into indigence.  So that there will be two sorts of people among them,
-who deserve that their fortunes should be interchanged--the former
-useless, but wicked and ravenous; and the latter, who by their constant
-industry serve the public more than themselves, sincere and modest
-men--from whence I am persuaded that till property is taken away, there
-can be no equitable or just distribution of things, nor can the world be
-happily governed; for as long as that is maintained, the greatest and the
-far best part of mankind, will be still oppressed with a load of cares
-and anxieties.  I confess, without taking it quite away, those pressures
-that lie on a great part of mankind may be made lighter, but they can
-never be quite removed; for if laws were made to determine at how great
-an extent in soil, and at how much money, every man must stop--to limit
-the prince, that he might not grow too great; and to restrain the people,
-that they might not become too insolent--and that none might factiously
-aspire to public employments, which ought neither to be sold nor made
-burdensome by a great expense, since otherwise those that serve in them
-would be tempted to reimburse themselves by cheats and violence, and it
-would become necessary to find out rich men for undergoing those
-employments, which ought rather to be trusted to the wise.  These laws, I
-say, might have such effect as good diet and care might have on a sick
-man whose recovery is desperate; they might allay and mitigate the
-disease, but it could never be quite healed, nor the body politic be
-brought again to a good habit as long as property remains; and it will
-fall out, as in a complication of diseases, that by applying a remedy to
-one sore you will provoke another, and that which removes the one ill
-symptom produces others, while the strengthening one part of the body
-weakens the rest."  "On the contrary," answered I, "it seems to me that
-men cannot live conveniently where all things are common.  How can there
-be any plenty where every man will excuse himself from labour? for as the
-hope of gain doth not excite him, so the confidence that he has in other
-men's industry may make him slothful.  If people come to be pinched with
-want, and yet cannot dispose of anything as their own, what can follow
-upon this but perpetual sedition and bloodshed, especially when the
-reverence and authority due to magistrates falls to the ground? for I
-cannot imagine how that can be kept up among those that are in all things
-equal to one another."  "I do not wonder," said he, "that it appears so
-to you, since you have no notion, or at least no right one, of such a
-constitution; but if you had been in Utopia with me, and had seen their
-laws and rules, as I did, for the space of five years, in which I lived
-among them, and during which time I was so delighted with them that
-indeed I should never have left them if it had not been to make the
-discovery of that new world to the Europeans, you would then confess that
-you had never seen a people so well constituted as they."  "You will not
-easily persuade me," said Peter, "that any nation in that new world is
-better governed than those among us; for as our understandings are not
-worse than theirs, so our government (if I mistake not) being more
-ancient, a long practice has helped us to find out many conveniences of
-life, and some happy chances have discovered other things to us which no
-man's understanding could ever have invented."  "As for the antiquity
-either of their government or of ours," said he, "you cannot pass a true
-judgment of it unless you had read their histories; for, if they are to
-be believed, they had towns among them before these parts were so much as
-inhabited; and as for those discoveries that have been either hit on by
-chance or made by ingenious men, these might have happened there as well
-as here.  I do not deny but we are more ingenious than they are, but they
-exceed us much in industry and application.  They knew little concerning
-us before our arrival among them.  They call us all by a general name of
-'The nations that lie beyond the equinoctial line;' for their chronicle
-mentions a shipwreck that was made on their coast twelve hundred years
-ago, and that some Romans and Egyptians that were in the ship, getting
-safe ashore, spent the rest of their days amongst them; and such was
-their ingenuity that from this single opportunity they drew the advantage
-of learning from those unlooked-for guests, and acquired all the useful
-arts that were then among the Romans, and which were known to these
-shipwrecked men; and by the hints that they gave them they themselves
-found out even some of those arts which they could not fully explain, so
-happily did they improve that accident of having some of our people cast
-upon their shore.  But if such an accident has at any time brought any
-from thence into Europe, we have been so far from improving it that we do
-not so much as remember it, as, in aftertimes perhaps, it will be forgot
-by our people that I was ever there; for though they, from one such
-accident, made themselves masters of all the good inventions that were
-among us, yet I believe it would be long before we should learn or put in
-practice any of the good institutions that are among them.  And this is
-the true cause of their being better governed and living happier than we,
-though we come not short of them in point of understanding or outward
-advantages."  Upon this I said to him, "I earnestly beg you would
-describe that island very particularly to us; be not too short, but set
-out in order all things relating to their soil, their rivers, their
-towns, their people, their manners, constitution, laws, and, in a word,
-all that you imagine we desire to know; and you may well imagine that we
-desire to know everything concerning them of which we are hitherto
-ignorant."  "I will do it very willingly," said he, "for I have digested
-the whole matter carefully, but it will take up some time."  "Let us go,
-then," said I, "first and dine, and then we shall have leisure enough."
-He consented; we went in and dined, and after dinner came back and sat
-down in the same place.  I ordered my servants to take care that none
-might come and interrupt us, and both Peter and I desired Raphael to be
-as good as his word.  When he saw that we were very intent upon it he
-paused a little to recollect himself, and began in this manner:--
-
-"The island of Utopia is in the middle two hundred miles broad, and holds
-almost at the same breadth over a great part of it, but it grows narrower
-towards both ends.  Its figure is not unlike a crescent.  Between its
-horns the sea comes in eleven miles broad, and spreads itself into a
-great bay, which is environed with land to the compass of about five
-hundred miles, and is well secured from winds.  In this bay there is no
-great current; the whole coast is, as it were, one continued harbour,
-which gives all that live in the island great convenience for mutual
-commerce.  But the entry into the bay, occasioned by rocks on the one
-hand and shallows on the other, is very dangerous.  In the middle of it
-there is one single rock which appears above water, and may, therefore,
-easily be avoided; and on the top of it there is a tower, in which a
-garrison is kept; the other rocks lie under water, and are very
-dangerous.  The channel is known only to the natives; so that if any
-stranger should enter into the bay without one of their pilots he would
-run great danger of shipwreck.  For even they themselves could not pass
-it safe if some marks that are on the coast did not direct their way; and
-if these should be but a little shifted, any fleet that might come
-against them, how great soever it were, would be certainly lost.  On the
-other side of the island there are likewise many harbours; and the coast
-is so fortified, both by nature and art, that a small number of men can
-hinder the descent of a great army.  But they report (and there remains
-good marks of it to make it credible) that this was no island at first,
-but a part of the continent.  Utopus, that conquered it (whose name it
-still carries, for Abraxa was its first name), brought the rude and
-uncivilised inhabitants into such a good government, and to that measure
-of politeness, that they now far excel all the rest of mankind.  Having
-soon subdued them, he designed to separate them from the continent, and
-to bring the sea quite round them.  To accomplish this he ordered a deep
-channel to be dug, fifteen miles long; and that the natives might not
-think he treated them like slaves, he not only forced the inhabitants,
-but also his own soldiers, to labour in carrying it on.  As he set a vast
-number of men to work, he, beyond all men's expectations, brought it to a
-speedy conclusion.  And his neighbours, who at first laughed at the folly
-of the undertaking, no sooner saw it brought to perfection than they were
-struck with admiration and terror.
-
-"There are fifty-four cities in the island, all large and well built, the
-manners, customs, and laws of which are the same, and they are all
-contrived as near in the same manner as the ground on which they stand
-will allow.  The nearest lie at least twenty-four miles' distance from
-one another, and the most remote are not so far distant but that a man
-can go on foot in one day from it to that which lies next it.  Every city
-sends three of their wisest senators once a year to Amaurot, to consult
-about their common concerns; for that is the chief town of the island,
-being situated near the centre of it, so that it is the most convenient
-place for their assemblies.  The jurisdiction of every city extends at
-least twenty miles, and, where the towns lie wider, they have much more
-ground.  No town desires to enlarge its bounds, for the people consider
-themselves rather as tenants than landlords.  They have built, over all
-the country, farmhouses for husbandmen, which are well contrived, and
-furnished with all things necessary for country labour.  Inhabitants are
-sent, by turns, from the cities to dwell in them; no country family has
-fewer than forty men and women in it, besides two slaves.  There is a
-master and a mistress set over every family, and over thirty families
-there is a magistrate.  Every year twenty of this family come back to the
-town after they have stayed two years in the country, and in their room
-there are other twenty sent from the town, that they may learn country
-work from those that have been already one year in the country, as they
-must teach those that come to them the next from the town.  By this means
-such as dwell in those country farms are never ignorant of agriculture,
-and so commit no errors which might otherwise be fatal and bring them
-under a scarcity of corn.  But though there is every year such a shifting
-of the husbandmen to prevent any man being forced against his will to
-follow that hard course of life too long, yet many among them take such
-pleasure in it that they desire leave to continue in it many years.  These
-husbandmen till the ground, breed cattle, hew wood, and convey it to the
-towns either by land or water, as is most convenient.  They breed an
-infinite multitude of chickens in a very curious manner; for the hens do
-not sit and hatch them, but a vast number of eggs are laid in a gentle
-and equal heat in order to be hatched, and they are no sooner out of the
-shell, and able to stir about, but they seem to consider those that feed
-them as their mothers, and follow them as other chickens do the hen that
-hatched them.  They breed very few horses, but those they have are full
-of mettle, and are kept only for exercising their youth in the art of
-sitting and riding them; for they do not put them to any work, either of
-ploughing or carriage, in which they employ oxen.  For though their
-horses are stronger, yet they find oxen can hold out longer; and as they
-are not subject to so many diseases, so they are kept upon a less charge
-and with less trouble.  And even when they are so worn out that they are
-no more fit for labour, they are good meat at last.  They sow no corn but
-that which is to be their bread; for they drink either wine, cider or
-perry, and often water, sometimes boiled with honey or liquorice, with
-which they abound; and though they know exactly how much corn will serve
-every town and all that tract of country which belongs to it, yet they
-sow much more and breed more cattle than are necessary for their
-consumption, and they give that overplus of which they make no use to
-their neighbours.  When they want anything in the country which it does
-not produce, they fetch that from the town, without carrying anything in
-exchange for it.  And the magistrates of the town take care to see it
-given them; for they meet generally in the town once a month, upon a
-festival day.  When the time of harvest comes, the magistrates in the
-country send to those in the towns and let them know how many hands they
-will need for reaping the harvest; and the number they call for being
-sent to them, they commonly despatch it all in one day.
-
-
-
-OF THEIR TOWNS, PARTICULARLY OF AMAUROT
-
-
-"He that knows one of their towns knows them all--they are so like one
-another, except where the situation makes some difference.  I shall
-therefore describe one of them, and none is so proper as Amaurot; for as
-none is more eminent (all the rest yielding in precedence to this,
-because it is the seat of their supreme council), so there was none of
-them better known to me, I having lived five years all together in it.
-
-"It lies upon the side of a hill, or, rather, a rising ground.  Its
-figure is almost square, for from the one side of it, which shoots up
-almost to the top of the hill, it runs down, in a descent for two miles,
-to the river Anider; but it is a little broader the other way that runs
-along by the bank of that river.  The Anider rises about eighty miles
-above Amaurot, in a small spring at first.  But other brooks falling into
-it, of which two are more considerable than the rest, as it runs by
-Amaurot it is grown half a mile broad; but, it still grows larger and
-larger, till, after sixty miles' course below it, it is lost in the
-ocean.  Between the town and the sea, and for some miles above the town,
-it ebbs and flows every six hours with a strong current.  The tide comes
-up about thirty miles so full that there is nothing but salt water in the
-river, the fresh water being driven back with its force; and above that,
-for some miles, the water is brackish; but a little higher, as it runs by
-the town, it is quite fresh; and when the tide ebbs, it continues fresh
-all along to the sea.  There is a bridge cast over the river, not of
-timber, but of fair stone, consisting of many stately arches; it lies at
-that part of the town which is farthest from the sea, so that the ships,
-without any hindrance, lie all along the side of the town.  There is,
-likewise, another river that runs by it, which, though it is not great,
-yet it runs pleasantly, for it rises out of the same hill on which the
-town stands, and so runs down through it and falls into the Anider.  The
-inhabitants have fortified the fountain-head of this river, which springs
-a little without the towns; that so, if they should happen to be
-besieged, the enemy might not be able to stop or divert the course of the
-water, nor poison it; from thence it is carried, in earthen pipes, to the
-lower streets.  And for those places of the town to which the water of
-that small river cannot be conveyed, they have great cisterns for
-receiving the rain-water, which supplies the want of the other.  The town
-is compassed with a high and thick wall, in which there are many towers
-and forts; there is also a broad and deep dry ditch, set thick with
-thorns, cast round three sides of the town, and the river is instead of a
-ditch on the fourth side.  The streets are very convenient for all
-carriage, and are well sheltered from the winds.  Their buildings are
-good, and are so uniform that a whole side of a street looks like one
-house.  The streets are twenty feet broad; there lie gardens behind all
-their houses.  These are large, but enclosed with buildings, that on all
-hands face the streets, so that every house has both a door to the street
-and a back door to the garden.  Their doors have all two leaves, which,
-as they are easily opened, so they shut of their own accord; and, there
-being no property among them, every man may freely enter into any house
-whatsoever.  At every ten years' end they shift their houses by lots.
-They cultivate their gardens with great care, so that they have both
-vines, fruits, herbs, and flowers in them; and all is so well ordered and
-so finely kept that I never saw gardens anywhere that were both so
-fruitful and so beautiful as theirs.  And this humour of ordering their
-gardens so well is not only kept up by the pleasure they find in it, but
-also by an emulation between the inhabitants of the several streets, who
-vie with each other.  And there is, indeed, nothing belonging to the
-whole town that is both more useful and more pleasant.  So that he who
-founded the town seems to have taken care of nothing more than of their
-gardens; for they say the whole scheme of the town was designed at first
-by Utopus, but he left all that belonged to the ornament and improvement
-of it to be added by those that should come after him, that being too
-much for one man to bring to perfection.  Their records, that contain the
-history of their town and State, are preserved with an exact care, and
-run backwards seventeen hundred and sixty years.  From these it appears
-that their houses were at first low and mean, like cottages, made of any
-sort of timber, and were built with mud walls and thatched with straw.
-But now their houses are three storeys high, the fronts of them are faced
-either with stone, plastering, or brick, and between the facings of their
-walls they throw in their rubbish.  Their roofs are flat, and on them
-they lay a sort of plaster, which costs very little, and yet is so
-tempered that it is not apt to take fire, and yet resists the weather
-more than lead.  They have great quantities of glass among them, with
-which they glaze their windows; they use also in their windows a thin
-linen cloth, that is so oiled or gummed that it both keeps out the wind
-and gives free admission to the light.
-
-
-
-OF THEIR MAGISTRATES
-
-
-"Thirty families choose every year a magistrate, who was anciently called
-the Syphogrant, but is now called the Philarch; and over every ten
-Syphogrants, with the families subject to them, there is another
-magistrate, who was anciently called the Tranibore, but of late the
-Archphilarch.  All the Syphogrants, who are in number two hundred, choose
-the Prince out of a list of four who are named by the people of the four
-divisions of the city; but they take an oath, before they proceed to an
-election, that they will choose him whom they think most fit for the
-office: they give him their voices secretly, so that it is not known for
-whom every one gives his suffrage.  The Prince is for life, unless he is
-removed upon suspicion of some design to enslave the people.  The
-Tranibors are new chosen every year, but yet they are, for the most part,
-continued; all their other magistrates are only annual.  The Tranibors
-meet every third day, and oftener if necessary, and consult with the
-Prince either concerning the affairs of the State in general, or such
-private differences as may arise sometimes among the people, though that
-falls out but seldom.  There are always two Syphogrants called into the
-council chamber, and these are changed every day.  It is a fundamental
-rule of their government, that no conclusion can be made in anything that
-relates to the public till it has been first debated three several days
-in their council.  It is death for any to meet and consult concerning the
-State, unless it be either in their ordinary council, or in the assembly
-of the whole body of the people.
-
-"These things have been so provided among them that the Prince and the
-Tranibors may not conspire together to change the government and enslave
-the people; and therefore when anything of great importance is set on
-foot, it is sent to the Syphogrants, who, after they have communicated it
-to the families that belong to their divisions, and have considered it
-among themselves, make report to the senate; and, upon great occasions,
-the matter is referred to the council of the whole island.  One rule
-observed in their council is, never to debate a thing on the same day in
-which it is first proposed; for that is always referred to the next
-meeting, that so men may not rashly and in the heat of discourse engage
-themselves too soon, which might bias them so much that, instead of
-consulting the good of the public, they might rather study to support
-their first opinions, and by a perverse and preposterous sort of shame
-hazard their country rather than endanger their own reputation, or
-venture the being suspected to have wanted foresight in the expedients
-that they at first proposed; and therefore, to prevent this, they take
-care that they may rather be deliberate than sudden in their motions.
-
-
-
-OF THEIR TRADES, AND MANNER OF LIFE
-
-
-"Agriculture is that which is so universally understood among them that
-no person, either man or woman, is ignorant of it; they are instructed in
-it from their childhood, partly by what they learn at school, and partly
-by practice, they being led out often into the fields about the town,
-where they not only see others at work but are likewise exercised in it
-themselves.  Besides agriculture, which is so common to them all, every
-man has some peculiar trade to which he applies himself; such as the
-manufacture of wool or flax, masonry, smith's work, or carpenter's work;
-for there is no sort of trade that is in great esteem among them.
-Throughout the island they wear the same sort of clothes, without any
-other distinction except what is necessary to distinguish the two sexes
-and the married and unmarried.  The fashion never alters, and as it is
-neither disagreeable nor uneasy, so it is suited to the climate, and
-calculated both for their summers and winters.  Every family makes their
-own clothes; but all among them, women as well as men, learn one or other
-of the trades formerly mentioned.  Women, for the most part, deal in wool
-and flax, which suit best with their weakness, leaving the ruder trades
-to the men.  The same trade generally passes down from father to son,
-inclinations often following descent: but if any man's genius lies
-another way he is, by adoption, translated into a family that deals in
-the trade to which he is inclined; and when that is to be done, care is
-taken, not only by his father, but by the magistrate, that he may be put
-to a discreet and good man: and if, after a person has learned one trade,
-he desires to acquire another, that is also allowed, and is managed in
-the same manner as the former.  When he has learned both, he follows that
-which he likes best, unless the public has more occasion for the other.
-
-The chief, and almost the only, business of the Syphogrants is to take
-care that no man may live idle, but that every one may follow his trade
-diligently; yet they do not wear themselves out with perpetual toil from
-morning to night, as if they were beasts of burden, which as it is indeed
-a heavy slavery, so it is everywhere the common course of life amongst
-all mechanics except the Utopians: but they, dividing the day and night
-into twenty-four hours, appoint six of these for work, three of which are
-before dinner and three after; they then sup, and at eight o'clock,
-counting from noon, go to bed and sleep eight hours: the rest of their
-time, besides that taken up in work, eating, and sleeping, is left to
-every man's discretion; yet they are not to abuse that interval to luxury
-and idleness, but must employ it in some proper exercise, according to
-their various inclinations, which is, for the most part, reading.  It is
-ordinary to have public lectures every morning before daybreak, at which
-none are obliged to appear but those who are marked out for literature;
-yet a great many, both men and women, of all ranks, go to hear lectures
-of one sort or other, according to their inclinations: but if others that
-are not made for contemplation, choose rather to employ themselves at
-that time in their trades, as many of them do, they are not hindered, but
-are rather commended, as men that take care to serve their country.  After
-supper they spend an hour in some diversion, in summer in their gardens,
-and in winter in the halls where they eat, where they entertain each
-other either with music or discourse.  They do not so much as know dice,
-or any such foolish and mischievous games.  They have, however, two sorts
-of games not unlike our chess; the one is between several numbers, in
-which one number, as it were, consumes another; the other resembles a
-battle between the virtues and the vices, in which the enmity in the
-vices among themselves, and their agreement against virtue, is not
-unpleasantly represented; together with the special opposition between
-the particular virtues and vices; as also the methods by which vice
-either openly assaults or secretly undermines virtue; and virtue, on the
-other hand, resists it.  But the time appointed for labour is to be
-narrowly examined, otherwise you may imagine that since there are only
-six hours appointed for work, they may fall under a scarcity of necessary
-provisions: but it is so far from being true that this time is not
-sufficient for supplying them with plenty of all things, either necessary
-or convenient, that it is rather too much; and this you will easily
-apprehend if you consider how great a part of all other nations is quite
-idle.  First, women generally do little, who are the half of mankind; and
-if some few women are diligent, their husbands are idle: then consider
-the great company of idle priests, and of those that are called religious
-men; add to these all rich men, chiefly those that have estates in land,
-who are called noblemen and gentlemen, together with their families, made
-up of idle persons, that are kept more for show than use; add to these
-all those strong and lusty beggars that go about pretending some disease
-in excuse for their begging; and upon the whole account you will find
-that the number of those by whose labours mankind is supplied is much
-less than you perhaps imagined: then consider how few of those that work
-are employed in labours that are of real service, for we, who measure all
-things by money, give rise to many trades that are both vain and
-superfluous, and serve only to support riot and luxury: for if those who
-work were employed only in such things as the conveniences of life
-require, there would be such an abundance of them that the prices of them
-would so sink that tradesmen could not be maintained by their gains; if
-all those who labour about useless things were set to more profitable
-employments, and if all they that languish out their lives in sloth and
-idleness (every one of whom consumes as much as any two of the men that
-are at work) were forced to labour, you may easily imagine that a small
-proportion of time would serve for doing all that is either necessary,
-profitable, or pleasant to mankind, especially while pleasure is kept
-within its due bounds: this appears very plainly in Utopia; for there, in
-a great city, and in all the territory that lies round it, you can scarce
-find five hundred, either men or women, by their age and strength capable
-of labour, that are not engaged in it.  Even the Syphogrants, though
-excused by the law, yet do not excuse themselves, but work, that by their
-examples they may excite the industry of the rest of the people; the like
-exemption is allowed to those who, being recommended to the people by the
-priests, are, by the secret suffrages of the Syphogrants, privileged from
-labour, that they may apply themselves wholly to study; and if any of
-these fall short of those hopes that they seemed at first to give, they
-are obliged to return to work; and sometimes a mechanic that so employs
-his leisure hours as to make a considerable advancement in learning is
-eased from being a tradesman and ranked among their learned men.  Out of
-these they choose their ambassadors, their priests, their Tranibors, and
-the Prince himself, anciently called their Barzenes, but is called of
-late their Ademus.
-
-"And thus from the great numbers among them that are neither suffered to
-be idle nor to be employed in any fruitless labour, you may easily make
-the estimate how much may be done in those few hours in which they are
-obliged to labour.  But, besides all that has been already said, it is to
-be considered that the needful arts among them are managed with less
-labour than anywhere else.  The building or the repairing of houses among
-us employ many hands, because often a thriftless heir suffers a house
-that his father built to fall into decay, so that his successor must, at
-a great cost, repair that which he might have kept up with a small
-charge; it frequently happens that the same house which one person built
-at a vast expense is neglected by another, who thinks he has a more
-delicate sense of the beauties of architecture, and he, suffering it to
-fall to ruin, builds another at no less charge.  But among the Utopians
-all things are so regulated that men very seldom build upon a new piece
-of ground, and are not only very quick in repairing their houses, but
-show their foresight in preventing their decay, so that their buildings
-are preserved very long with but very little labour, and thus the
-builders, to whom that care belongs, are often without employment, except
-the hewing of timber and the squaring of stones, that the materials may
-be in readiness for raising a building very suddenly when there is any
-occasion for it.  As to their clothes, observe how little work is spent
-in them; while they are at labour they are clothed with leather and
-skins, cut carelessly about them, which will last seven years, and when
-they appear in public they put on an upper garment which hides the other;
-and these are all of one colour, and that is the natural colour of the
-wool.  As they need less woollen cloth than is used anywhere else, so
-that which they make use of is much less costly; they use linen cloth
-more, but that is prepared with less labour, and they value cloth only by
-the whiteness of the linen or the cleanness of the wool, without much
-regard to the fineness of the thread.  While in other places four or five
-upper garments of woollen cloth of different colours, and as many vests
-of silk, will scarce serve one man, and while those that are nicer think
-ten too few, every man there is content with one, which very often serves
-him two years; nor is there anything that can tempt a man to desire more,
-for if he had them he would neither be the, warmer nor would he make one
-jot the better appearance for it.  And thus, since they are all employed
-in some useful labour, and since they content themselves with fewer
-things, it falls out that there is a great abundance of all things among
-them; so that it frequently happens that, for want of other work, vast
-numbers are sent out to mend the highways; but when no public undertaking
-is to be performed, the hours of working are lessened.  The magistrates
-never engage the people in unnecessary labour, since the chief end of the
-constitution is to regulate labour by the necessities of the public, and
-to allow the people as much time as is necessary for the improvement of
-their minds, in which they think the happiness of life consists.
-
-
-
-OF THEIR TRAFFIC
-
-
-"But it is now time to explain to you the mutual intercourse of this
-people, their commerce, and the rules by which all things are distributed
-among them.
-
-"As their cities are composed of families, so their families are made up
-of those that are nearly related to one another.  Their women, when they
-grow up, are married out, but all the males, both children and
-grand-children, live still in the same house, in great obedience to their
-common parent, unless age has weakened his understanding, and in that
-case he that is next to him in age comes in his room; but lest any city
-should become either too great, or by any accident be dispeopled,
-provision is made that none of their cities may contain above six
-thousand families, besides those of the country around it.  No family may
-have less than ten and more than sixteen persons in it, but there can be
-no determined number for the children under age; this rule is easily
-observed by removing some of the children of a more fruitful couple to
-any other family that does not abound so much in them.  By the same rule
-they supply cities that do not increase so fast from others that breed
-faster; and if there is any increase over the whole island, then they
-draw out a number of their citizens out of the several towns and send
-them over to the neighbouring continent, where, if they find that the
-inhabitants have more soil than they can well cultivate, they fix a
-colony, taking the inhabitants into their society if they are willing to
-live with them; and where they do that of their own accord, they quickly
-enter into their method of life and conform to their rules, and this
-proves a happiness to both nations; for, according to their constitution,
-such care is taken of the soil that it becomes fruitful enough for both,
-though it might be otherwise too narrow and barren for any one of them.
-But if the natives refuse to conform themselves to their laws they drive
-them out of those bounds which they mark out for themselves, and use
-force if they resist, for they account it a very just cause of war for a
-nation to hinder others from possessing a part of that soil of which they
-make no use, but which is suffered to lie idle and uncultivated, since
-every man has, by the law of nature, a right to such a waste portion of
-the earth as is necessary for his subsistence.  If an accident has so
-lessened the number of the inhabitants of any of their towns that it
-cannot be made up from the other towns of the island without diminishing
-them too much (which is said to have fallen out but twice since they were
-first a people, when great numbers were carried off by the plague), the
-loss is then supplied by recalling as many as are wanted from their
-colonies, for they will abandon these rather than suffer the towns in the
-island to sink too low.
-
-"But to return to their manner of living in society: the oldest man of
-every family, as has been already said, is its governor; wives serve
-their husbands, and children their parents, and always the younger serves
-the elder.  Every city is divided into four equal parts, and in the
-middle of each there is a market-place.  What is brought thither, and
-manufactured by the several families, is carried from thence to houses
-appointed for that purpose, in which all things of a sort are laid by
-themselves; and thither every father goes, and takes whatsoever he or his
-family stand in need of, without either paying for it or leaving anything
-in exchange.  There is no reason for giving a denial to any person, since
-there is such plenty of everything among them; and there is no danger of
-a man's asking for more than he needs; they have no inducements to do
-this, since they are sure they shall always be supplied: it is the fear
-of want that makes any of the whole race of animals either greedy or
-ravenous; but, besides fear, there is in man a pride that makes him fancy
-it a particular glory to excel others in pomp and excess; but by the laws
-of the Utopians, there is no room for this.  Near these markets there are
-others for all sorts of provisions, where there are not only herbs,
-fruits, and bread, but also fish, fowl, and cattle.  There are also,
-without their towns, places appointed near some running water for killing
-their beasts and for washing away their filth, which is done by their
-slaves; for they suffer none of their citizens to kill their cattle,
-because they think that pity and good-nature, which are among the best of
-those affections that are born with us, are much impaired by the
-butchering of animals; nor do they suffer anything that is foul or
-unclean to be brought within their towns, lest the air should be infected
-by ill-smells, which might prejudice their health.  In every street there
-are great halls, that lie at an equal distance from each other,
-distinguished by particular names.  The Syphogrants dwell in those that
-are set over thirty families, fifteen lying on one side of it, and as
-many on the other.  In these halls they all meet and have their repasts;
-the stewards of every one of them come to the market-place at an
-appointed hour, and according to the number of those that belong to the
-hall they carry home provisions.  But they take more care of their sick
-than of any others; these are lodged and provided for in public
-hospitals.  They have belonging to every town four hospitals, that are
-built without their walls, and are so large that they may pass for little
-towns; by this means, if they had ever such a number of sick persons,
-they could lodge them conveniently, and at such a distance that such of
-them as are sick of infectious diseases may be kept so far from the rest
-that there can be no danger of contagion.  The hospitals are furnished
-and stored with all things that are convenient for the ease and recovery
-of the sick; and those that are put in them are looked after with such
-tender and watchful care, and are so constantly attended by their skilful
-physicians, that as none is sent to them against their will, so there is
-scarce one in a whole town that, if he should fall ill, would not choose
-rather to go thither than lie sick at home.
-
-"After the steward of the hospitals has taken for the sick whatsoever the
-physician prescribes, then the best things that are left in the market
-are distributed equally among the halls in proportion to their numbers;
-only, in the first place, they serve the Prince, the Chief Priest, the
-Tranibors, the Ambassadors, and strangers, if there are any, which,
-indeed, falls out but seldom, and for whom there are houses, well
-furnished, particularly appointed for their reception when they come
-among them.  At the hours of dinner and supper the whole Syphogranty
-being called together by sound of trumpet, they meet and eat together,
-except only such as are in the hospitals or lie sick at home.  Yet, after
-the halls are served, no man is hindered to carry provisions home from
-the market-place, for they know that none does that but for some good
-reason; for though any that will may eat at home, yet none does it
-willingly, since it is both ridiculous and foolish for any to give
-themselves the trouble to make ready an ill dinner at home when there is
-a much more plentiful one made ready for him so near hand.  All the
-uneasy and sordid services about these halls are performed by their
-slaves; but the dressing and cooking their meat, and the ordering their
-tables, belong only to the women, all those of every family taking it by
-turns.  They sit at three or more tables, according to their number; the
-men sit towards the wall, and the women sit on the other side, that if
-any of them should be taken suddenly ill, which is no uncommon case
-amongst women with child, she may, without disturbing the rest, rise and
-go to the nurses' room (who are there with the sucking children), where
-there is always clean water at hand and cradles, in which they may lay
-the young children if there is occasion for it, and a fire, that they may
-shift and dress them before it.  Every child is nursed by its own mother
-if death or sickness does not intervene; and in that case the
-Syphogrants' wives find out a nurse quickly, which is no hard matter, for
-any one that can do it offers herself cheerfully; for as they are much
-inclined to that piece of mercy, so the child whom they nurse considers
-the nurse as its mother.  All the children under five years old sit among
-the nurses; the rest of the younger sort of both sexes, till they are fit
-for marriage, either serve those that sit at table, or, if they are not
-strong enough for that, stand by them in great silence and eat what is
-given them; nor have they any other formality of dining.  In the middle
-of the first table, which stands across the upper end of the hall, sit
-the Syphogrant and his wife, for that is the chief and most conspicuous
-place; next to him sit two of the most ancient, for there go always four
-to a mess.  If there is a temple within the Syphogranty, the Priest and
-his wife sit with the Syphogrant above all the rest; next them there is a
-mixture of old and young, who are so placed that as the young are set
-near others, so they are mixed with the more ancient; which, they say,
-was appointed on this account: that the gravity of the old people, and
-the reverence that is due to them, might restrain the younger from all
-indecent words and gestures.  Dishes are not served up to the whole table
-at first, but the best are first set before the old, whose seats are
-distinguished from the young, and, after them, all the rest are served
-alike.  The old men distribute to the younger any curious meats that
-happen to be set before them, if there is not such an abundance of them
-that the whole company may be served alike.
-
-"Thus old men are honoured with a particular respect, yet all the rest
-fare as well as they.  Both dinner and supper are begun with some lecture
-of morality that is read to them; but it is so short that it is not
-tedious nor uneasy to them to hear it.  From hence the old men take
-occasion to entertain those about them with some useful and pleasant
-enlargements; but they do not engross the whole discourse so to
-themselves during their meals that the younger may not put in for a
-share; on the contrary, they engage them to talk, that so they may, in
-that free way of conversation, find out the force of every one's spirit
-and observe his temper.  They despatch their dinners quickly, but sit
-long at supper, because they go to work after the one, and are to sleep
-after the other, during which they think the stomach carries on the
-concoction more vigorously.  They never sup without music, and there is
-always fruit served up after meat; while they are at table some burn
-perfumes and sprinkle about fragrant ointments and sweet waters--in
-short, they want nothing that may cheer up their spirits; they give
-themselves a large allowance that way, and indulge themselves in all such
-pleasures as are attended with no inconvenience.  Thus do those that are
-in the towns live together; but in the country, where they live at a
-great distance, every one eats at home, and no family wants any necessary
-sort of provision, for it is from them that provisions are sent unto
-those that live in the towns.
-
-
-
-OF THE TRAVELLING OF THE UTOPIANS
-
-
-If any man has a mind to visit his friends that live in some other town,
-or desires to travel and see the rest of the country, he obtains leave
-very easily from the Syphogrant and Tranibors, when there is no
-particular occasion for him at home.  Such as travel carry with them a
-passport from the Prince, which both certifies the licence that is
-granted for travelling, and limits the time of their return.  They are
-furnished with a waggon and a slave, who drives the oxen and looks after
-them; but, unless there are women in the company, the waggon is sent back
-at the end of the journey as a needless encumbrance.  While they are on
-the road they carry no provisions with them, yet they want for nothing,
-but are everywhere treated as if they were at home.  If they stay in any
-place longer than a night, every one follows his proper occupation, and
-is very well used by those of his own trade; but if any man goes out of
-the city to which he belongs without leave, and is found rambling without
-a passport, he is severely treated, he is punished as a fugitive, and
-sent home disgracefully; and, if he falls again into the like fault, is
-condemned to slavery.  If any man has a mind to travel only over the
-precinct of his own city, he may freely do it, with his father's
-permission and his wife's consent; but when he comes into any of the
-country houses, if he expects to be entertained by them, he must labour
-with them and conform to their rules; and if he does this, he may freely
-go over the whole precinct, being then as useful to the city to which he
-belongs as if he were still within it.  Thus you see that there are no
-idle persons among them, nor pretences of excusing any from labour.  There
-are no taverns, no ale-houses, nor stews among them, nor any other
-occasions of corrupting each other, of getting into corners, or forming
-themselves into parties; all men live in full view, so that all are
-obliged both to perform their ordinary task and to employ themselves well
-in their spare hours; and it is certain that a people thus ordered must
-live in great abundance of all things, and these being equally
-distributed among them, no man can want or be obliged to beg.
-
-"In their great council at Amaurot, to which there are three sent from
-every town once a year, they examine what towns abound in provisions and
-what are under any scarcity, that so the one may be furnished from the
-other; and this is done freely, without any sort of exchange; for,
-according to their plenty or scarcity, they supply or are supplied from
-one another, so that indeed the whole island is, as it were, one family.
-When they have thus taken care of their whole country, and laid up stores
-for two years (which they do to prevent the ill consequences of an
-unfavourable season), they order an exportation of the overplus, both of
-corn, honey, wool, flax, wood, wax, tallow, leather, and cattle, which
-they send out, commonly in great quantities, to other nations.  They
-order a seventh part of all these goods to be freely given to the poor of
-the countries to which they send them, and sell the rest at moderate
-rates; and by this exchange they not only bring back those few things
-that they need at home (for, indeed, they scarce need anything but iron),
-but likewise a great deal of gold and silver; and by their driving this
-trade so long, it is not to be imagined how vast a treasure they have got
-among them, so that now they do not much care whether they sell off their
-merchandise for money in hand or upon trust.  A great part of their
-treasure is now in bonds; but in all their contracts no private man
-stands bound, but the writing runs in the name of the town; and the towns
-that owe them money raise it from those private hands that owe it to
-them, lay it up in their public chamber, or enjoy the profit of it till
-the Utopians call for it; and they choose rather to let the greatest part
-of it lie in their hands, who make advantage by it, than to call for it
-themselves; but if they see that any of their other neighbours stand more
-in need of it, then they call it in and lend it to them.  Whenever they
-are engaged in war, which is the only occasion in which their treasure
-can be usefully employed, they make use of it themselves; in great
-extremities or sudden accidents they employ it in hiring foreign troops,
-whom they more willingly expose to danger than their own people; they
-give them great pay, knowing well that this will work even on their
-enemies; that it will engage them either to betray their own side, or, at
-least, to desert it; and that it is the best means of raising mutual
-jealousies among them.  For this end they have an incredible treasure;
-but they do not keep it as a treasure, but in such a manner as I am
-almost afraid to tell, lest you think it so extravagant as to be hardly
-credible.  This I have the more reason to apprehend because, if I had not
-seen it myself, I could not have been easily persuaded to have believed
-it upon any man's report.
-
-"It is certain that all things appear incredible to us in proportion as
-they differ from known customs; but one who can judge aright will not
-wonder to find that, since their constitution differs so much from ours,
-their value of gold and silver should be measured by a very different
-standard; for since they have no use for money among themselves, but keep
-it as a provision against events which seldom happen, and between which
-there are generally long intervening intervals, they value it no farther
-than it deserves--that is, in proportion to its use.  So that it is plain
-they must prefer iron either to gold or silver, for men can no more live
-without iron than without fire or water; but Nature has marked out no use
-for the other metals so essential as not easily to be dispensed with.  The
-folly of men has enhanced the value of gold and silver because of their
-scarcity; whereas, on the contrary, it is their opinion that Nature, as
-an indulgent parent, has freely given us all the best things in great
-abundance, such as water and earth, but has laid up and hid from us the
-things that are vain and useless.
-
-"If these metals were laid up in any tower in the kingdom it would raise
-a jealousy of the Prince and Senate, and give birth to that foolish
-mistrust into which the people are apt to fall--a jealousy of their
-intending to sacrifice the interest of the public to their own private
-advantage.  If they should work it into vessels, or any sort of plate,
-they fear that the people might grow too fond of it, and so be unwilling
-to let the plate be run down, if a war made it necessary, to employ it in
-paying their soldiers.  To prevent all these inconveniences they have
-fallen upon an expedient which, as it agrees with their other policy, so
-is it very different from ours, and will scarce gain belief among us who
-value gold so much, and lay it up so carefully.  They eat and drink out
-of vessels of earth or glass, which make an agreeable appearance, though
-formed of brittle materials; while they make their chamber-pots and close-
-stools of gold and silver, and that not only in their public halls but in
-their private houses.  Of the same metals they likewise make chains and
-fetters for their slaves, to some of which, as a badge of infamy, they
-hang an earring of gold, and make others wear a chain or a coronet of the
-same metal; and thus they take care by all possible means to render gold
-and silver of no esteem; and from hence it is that while other nations
-part with their gold and silver as unwillingly as if one tore out their
-bowels, those of Utopia would look on their giving in all they possess of
-those metals (when there were any use for them) but as the parting with a
-trifle, or as we would esteem the loss of a penny!  They find pearls on
-their coasts, and diamonds and carbuncles on their rocks; they do not
-look after them, but, if they find them by chance, they polish them, and
-with them they adorn their children, who are delighted with them, and
-glory in them during their childhood; but when they grow to years, and
-see that none but children use such baubles, they of their own accord,
-without being bid by their parents, lay them aside, and would be as much
-ashamed to use them afterwards as children among us, when they come to
-years, are of their puppets and other toys.
-
-"I never saw a clearer instance of the opposite impressions that
-different customs make on people than I observed in the ambassadors of
-the Anemolians, who came to Amaurot when I was there.  As they came to
-treat of affairs of great consequence, the deputies from several towns
-met together to wait for their coming.  The ambassadors of the nations
-that lie near Utopia, knowing their customs, and that fine clothes are in
-no esteem among them, that silk is despised, and gold is a badge of
-infamy, used to come very modestly clothed; but the Anemolians, lying
-more remote, and having had little commerce with them, understanding that
-they were coarsely clothed, and all in the same manner, took it for
-granted that they had none of those fine things among them of which they
-made no use; and they, being a vainglorious rather than a wise people,
-resolved to set themselves out with so much pomp that they should look
-like gods, and strike the eyes of the poor Utopians with their splendour.
-Thus three ambassadors made their entry with a hundred attendants, all
-clad in garments of different colours, and the greater part in silk; the
-ambassadors themselves, who were of the nobility of their country, were
-in cloth-of-gold, and adorned with massy chains, earrings and rings of
-gold; their caps were covered with bracelets set full of pearls and other
-gems--in a word, they were set out with all those things that among the
-Utopians were either the badges of slavery, the marks of infamy, or the
-playthings of children.  It was not unpleasant to see, on the one side,
-how they looked big, when they compared their rich habits with the plain
-clothes of the Utopians, who were come out in great numbers to see them
-make their entry; and, on the other, to observe how much they were
-mistaken in the impression which they hoped this pomp would have made on
-them.  It appeared so ridiculous a show to all that had never stirred out
-of their country, and had not seen the customs of other nations, that
-though they paid some reverence to those that were the most meanly clad,
-as if they had been the ambassadors, yet when they saw the ambassadors
-themselves so full of gold and chains, they looked upon them as slaves,
-and forbore to treat them with reverence.  You might have seen the
-children who were grown big enough to despise their playthings, and who
-had thrown away their jewels, call to their mothers, push them gently,
-and cry out, 'See that great fool, that wears pearls and gems as if he
-were yet a child!' while their mothers very innocently replied, 'Hold
-your peace! this, I believe, is one of the ambassadors' fools.'  Others
-censured the fashion of their chains, and observed, 'That they were of no
-use, for they were too slight to bind their slaves, who could easily
-break them; and, besides, hung so loose about them that they thought it
-easy to throw their away, and so get from them."  But after the
-ambassadors had stayed a day among them, and saw so vast a quantity of
-gold in their houses (which was as much despised by them as it was
-esteemed in other nations), and beheld more gold and silver in the chains
-and fetters of one slave than all their ornaments amounted to, their
-plumes fell, and they were ashamed of all that glory for which they had
-formed valued themselves, and accordingly laid it aside--a resolution
-that they immediately took when, on their engaging in some free discourse
-with the Utopians, they discovered their sense of such things and their
-other customs.  The Utopians wonder how any man should be so much taken
-with the glaring doubtful lustre of a jewel or a stone, that can look up
-to a star or to the sun himself; or how any should value himself because
-his cloth is made of a finer thread; for, how fine soever that thread may
-be, it was once no better than the fleece of a sheep, and that sheep, was
-a sheep still, for all its wearing it.  They wonder much to hear that
-gold, which in itself is so useless a thing, should be everywhere so much
-esteemed that even man, for whom it was made, and by whom it has its
-value, should yet be thought of less value than this metal; that a man of
-lead, who has no more sense than a log of wood, and is as bad as he is
-foolish, should have many wise and good men to serve him, only because he
-has a great heap of that metal; and that if it should happen that by some
-accident or trick of law (which, sometimes produces as great changes as
-chance itself) all this wealth should pass from the master to the meanest
-varlet of his whole family, he himself would very soon become one of his
-servants, as if he were a thing that belonged to his wealth, and so were
-bound to follow its fortune!  But they much more admire and detest the
-folly of those who, when they see a rich man, though they neither owe him
-anything, nor are in any sort dependent on his bounty, yet, merely
-because he is rich, give him little less than divine honours, even though
-they know him to be so covetous and base-minded that, notwithstanding all
-his wealth, he will not part with one farthing of it to them as long as
-he lives!
-
-"These and such like notions have that people imbibed, partly from their
-education, being bred in a country whose customs and laws are opposite to
-all such foolish maxims, and partly from their learning and studies--for
-though there are but few in any town that are so wholly excused from
-labour as to give themselves entirely up to their studies (these being
-only such persons as discover from their childhood an extraordinary
-capacity and disposition for letters), yet their children and a great
-part of the nation, both men and women, are taught to spend those hours
-in which they are not obliged to work in reading; and this they do
-through the whole progress of life.  They have all their learning in
-their own tongue, which is both a copious and pleasant language, and in
-which a man can fully express his mind; it runs over a great tract of
-many countries, but it is not equally pure in all places.  They had never
-so much as heard of the names of any of those philosophers that are so
-famous in these parts of the world, before we went among them; and yet
-they had made the same discoveries as the Greeks, both in music, logic,
-arithmetic, and geometry.  But as they are almost in everything equal to
-the ancient philosophers, so they far exceed our modern logicians for
-they have never yet fallen upon the barbarous niceties that our youth are
-forced to learn in those trifling logical schools that are among us.  They
-are so far from minding chimeras and fantastical images made in the mind
-that none of them could comprehend what we meant when we talked to them
-of a man in the abstract as common to all men in particular (so that
-though we spoke of him as a thing that we could point at with our
-fingers, yet none of them could perceive him) and yet distinct from every
-one, as if he were some monstrous Colossus or giant; yet, for all this
-ignorance of these empty notions, they knew astronomy, and were perfectly
-acquainted with the motions of the heavenly bodies; and have many
-instruments, well contrived and divided, by which they very accurately
-compute the course and positions of the sun, moon, and stars.  But for
-the cheat of divining by the stars, by their oppositions or conjunctions,
-it has not so much as entered into their thoughts.  They have a
-particular sagacity, founded upon much observation, in judging of the
-weather, by which they know when they may look for rain, wind, or other
-alterations in the air; but as to the philosophy of these things, the
-cause of the saltness of the sea, of its ebbing and flowing, and of the
-original and nature both of the heavens and the earth, they dispute of
-them partly as our ancient philosophers have done, and partly upon some
-new hypothesis, in which, as they differ from them, so they do not in all
-things agree among themselves.
-
-"As to moral philosophy, they have the same disputes among them as we
-have here.  They examine what are properly good, both for the body and
-the mind; and whether any outward thing can be called truly _good_, or if
-that term belong only to the endowments of the soul.  They inquire,
-likewise, into the nature of virtue and pleasure.  But their chief
-dispute is concerning the happiness of a man, and wherein it
-consists--whether in some one thing or in a great many.  They seem,
-indeed, more inclinable to that opinion that places, if not the whole,
-yet the chief part, of a man's happiness in pleasure; and, what may seem
-more strange, they make use of arguments even from religion,
-notwithstanding its severity and roughness, for the support of that
-opinion so indulgent to pleasure; for they never dispute concerning
-happiness without fetching some arguments from the principles of religion
-as well as from natural reason, since without the former they reckon that
-all our inquiries after happiness must be but conjectural and defective.
-
-"These are their religious principles:--That the soul of man is immortal,
-and that God of His goodness has designed that it should be happy; and
-that He has, therefore, appointed rewards for good and virtuous actions,
-and punishments for vice, to be distributed after this life.  Though
-these principles of religion are conveyed down among them by tradition,
-they think that even reason itself determines a man to believe and
-acknowledge them; and freely confess that if these were taken away, no
-man would be so insensible as not to seek after pleasure by all possible
-means, lawful or unlawful, using only this caution--that a lesser
-pleasure might not stand in the way of a greater, and that no pleasure
-ought to be pursued that should draw a great deal of pain after it; for
-they think it the maddest thing in the world to pursue virtue, that is a
-sour and difficult thing, and not only to renounce the pleasures of life,
-but willingly to undergo much pain and trouble, if a man has no prospect
-of a reward.  And what reward can there be for one that has passed his
-whole life, not only without pleasure, but in pain, if there is nothing
-to be expected after death?  Yet they do not place happiness in all sorts
-of pleasures, but only in those that in themselves are good and honest.
-There is a party among them who place happiness in bare virtue; others
-think that our natures are conducted by virtue to happiness, as that
-which is the chief good of man.  They define virtue thus--that it is a
-living according to Nature, and think that we are made by God for that
-end; they believe that a man then follows the dictates of Nature when he
-pursues or avoids things according to the direction of reason.  They say
-that the first dictate of reason is the kindling in us a love and
-reverence for the Divine Majesty, to whom we owe both all that we have
-and, all that we can ever hope for.  In the next place, reason directs us
-to keep our minds as free from passion and as cheerful as we can, and
-that we should consider ourselves as bound by the ties of good-nature and
-humanity to use our utmost endeavours to help forward the happiness of
-all other persons; for there never was any man such a morose and severe
-pursuer of virtue, such an enemy to pleasure, that though he set hard
-rules for men to undergo, much pain, many watchings, and other rigors,
-yet did not at the same time advise them to do all they could in order to
-relieve and ease the miserable, and who did not represent gentleness and
-good-nature as amiable dispositions.  And from thence they infer that if
-a man ought to advance the welfare and comfort of the rest of mankind
-(there being no virtue more proper and peculiar to our nature than to
-ease the miseries of others, to free from trouble and anxiety, in
-furnishing them with the comforts of life, in which pleasure consists)
-Nature much more vigorously leads them to do all this for himself.  A
-life of pleasure is either a real evil, and in that case we ought not to
-assist others in their pursuit of it, but, on the contrary, to keep them
-from it all we can, as from that which is most hurtful and deadly; or if
-it is a good thing, so that we not only may but ought to help others to
-it, why, then, ought not a man to begin with himself? since no man can be
-more bound to look after the good of another than after his own; for
-Nature cannot direct us to be good and kind to others, and yet at the
-same time to be unmerciful and cruel to ourselves.  Thus as they define
-virtue to be living according to Nature, so they imagine that Nature
-prompts all people on to seek after pleasure as the end of all they do.
-They also observe that in order to our supporting the pleasures of life,
-Nature inclines us to enter into society; for there is no man so much
-raised above the rest of mankind as to be the only favourite of Nature,
-who, on the contrary, seems to have placed on a level all those that
-belong to the same species.  Upon this they infer that no man ought to
-seek his own conveniences so eagerly as to prejudice others; and
-therefore they think that not only all agreements between private persons
-ought to be observed, but likewise that all those laws ought to be kept
-which either a good prince has published in due form, or to which a
-people that is neither oppressed with tyranny nor circumvented by fraud
-has consented, for distributing those conveniences of life which afford
-us all our pleasures.
-
-"They think it is an evidence of true wisdom for a man to pursue his own
-advantage as far as the laws allow it, they account it piety to prefer
-the public good to one's private concerns, but they think it unjust for a
-man to seek for pleasure by snatching another man's pleasures from him;
-and, on the contrary, they think it a sign of a gentle and good soul for
-a man to dispense with his own advantage for the good of others, and that
-by this means a good man finds as much pleasure one way as he parts with
-another; for as he may expect the like from others when he may come to
-need it, so, if that should fail him, yet the sense of a good action, and
-the reflections that he makes on the love and gratitude of those whom he
-has so obliged, gives the mind more pleasure than the body could have
-found in that from which it had restrained itself.  They are also
-persuaded that God will make up the loss of those small pleasures with a
-vast and endless joy, of which religion easily convinces a good soul.
-
-"Thus, upon an inquiry into the whole matter, they reckon that all our
-actions, and even all our virtues, terminate in pleasure, as in our chief
-end and greatest happiness; and they call every motion or state, either
-of body or mind, in which Nature teaches us to delight, a pleasure.  Thus
-they cautiously limit pleasure only to those appetites to which Nature
-leads us; for they say that Nature leads us only to those delights to
-which reason, as well as sense, carries us, and by which we neither
-injure any other person nor lose the possession of greater pleasures, and
-of such as draw no troubles after them.  But they look upon those
-delights which men by a foolish, though common, mistake call pleasure, as
-if they could change as easily the nature of things as the use of words,
-as things that greatly obstruct their real happiness, instead of
-advancing it, because they so entirely possess the minds of those that
-are once captivated by them with a false notion of pleasure that there is
-no room left for pleasures of a truer or purer kind.
-
-"There are many things that in themselves have nothing that is truly
-delightful; on the contrary, they have a good deal of bitterness in them;
-and yet, from our perverse appetites after forbidden objects, are not
-only ranked among the pleasures, but are made even the greatest designs,
-of life.  Among those who pursue these sophisticated pleasures they
-reckon such as I mentioned before, who think themselves really the better
-for having fine clothes; in which they think they are doubly mistaken,
-both in the opinion they have of their clothes, and in that they have of
-themselves.  For if you consider the use of clothes, why should a fine
-thread be thought better than a coarse one?  And yet these men, as if
-they had some real advantages beyond others, and did not owe them wholly
-to their mistakes, look big, seem to fancy themselves to be more
-valuable, and imagine that a respect is due to them for the sake of a
-rich garment, to which they would not have pretended if they had been
-more meanly clothed, and even resent it as an affront if that respect is
-not paid them.  It is also a great folly to be taken with outward marks
-of respect, which signify nothing; for what true or real pleasure can one
-man find in another's standing bare or making legs to him?  Will the
-bending another man's knees give ease to yours? and will the head's being
-bare cure the madness of yours?  And yet it is wonderful to see how this
-false notion of pleasure bewitches many who delight themselves with the
-fancy of their nobility, and are pleased with this conceit--that they are
-descended from ancestors who have been held for some successions rich,
-and who have had great possessions; for this is all that makes nobility
-at present.  Yet they do not think themselves a whit the less noble,
-though their immediate parents have left none of this wealth to them, or
-though they themselves have squandered it away.  The Utopians have no
-better opinion of those who are much taken with gems and precious stones,
-and who account it a degree of happiness next to a divine one if they can
-purchase one that is very extraordinary, especially if it be of that sort
-of stones that is then in greatest request, for the same sort is not at
-all times universally of the same value, nor will men buy it unless it be
-dismounted and taken out of the gold.  The jeweller is then made to give
-good security, and required solemnly to swear that the stone is true,
-that, by such an exact caution, a false one might not be bought instead
-of a true; though, if you were to examine it, your eye could find no
-difference between the counterfeit and that which is true; so that they
-are all one to you, as much as if you were blind.  Or can it be thought
-that they who heap up a useless mass of wealth, not for any use that it
-is to bring them, but merely to please themselves with the contemplation
-of it, enjoy any true pleasure in it?  The delight they find is only a
-false shadow of joy.  Those are no better whose error is somewhat
-different from the former, and who hide it out of their fear of losing
-it; for what other name can fit the hiding it in the earth, or, rather,
-the restoring it to it again, it being thus cut off from being useful
-either to its owner or to the rest of mankind?  And yet the owner, having
-hid it carefully, is glad, because he thinks he is now sure of it.  If it
-should be stole, the owner, though he might live perhaps ten years after
-the theft, of which he knew nothing, would find no difference between his
-having or losing it, for both ways it was equally useless to him.
-
-"Among those foolish pursuers of pleasure they reckon all that delight in
-hunting, in fowling, or gaming, of whose madness they have only heard,
-for they have no such things among them.  But they have asked us, 'What
-sort of pleasure is it that men can find in throwing the dice?' (for if
-there were any pleasure in it, they think the doing it so often should
-give one a surfeit of it); 'and what pleasure can one find in hearing the
-barking and howling of dogs, which seem rather odious than pleasant
-sounds?'  Nor can they comprehend the pleasure of seeing dogs run after a
-hare, more than of seeing one dog run after another; for if the seeing
-them run is that which gives the pleasure, you have the same
-entertainment to the eye on both these occasions, since that is the same
-in both cases.  But if the pleasure lies in seeing the hare killed and
-torn by the dogs, this ought rather to stir pity, that a weak, harmless,
-and fearful hare should be devoured by strong, fierce, and cruel dogs.
-Therefore all this business of hunting is, among the Utopians, turned
-over to their butchers, and those, as has been already said, are all
-slaves, and they look on hunting as one of the basest parts of a
-butcher's work, for they account it both more profitable and more decent
-to kill those beasts that are more necessary and useful to mankind,
-whereas the killing and tearing of so small and miserable an animal can
-only attract the huntsman with a false show of pleasure, from which he
-can reap but small advantage.  They look on the desire of the bloodshed,
-even of beasts, as a mark of a mind that is already corrupted with
-cruelty, or that at least, by too frequent returns of so brutal a
-pleasure, must degenerate into it.
-
-"Thus though the rabble of mankind look upon these, and on innumerable
-other things of the same nature, as pleasures, the Utopians, on the
-contrary, observing that there is nothing in them truly pleasant,
-conclude that they are not to be reckoned among pleasures; for though
-these things may create some tickling in the senses (which seems to be a
-true notion of pleasure), yet they imagine that this does not arise from
-the thing itself, but from a depraved custom, which may so vitiate a
-man's taste that bitter things may pass for sweet, as women with child
-think pitch or tallow taste sweeter than honey; but as a man's sense,
-when corrupted either by a disease or some ill habit, does not change the
-nature of other things, so neither can it change the nature of pleasure.
-
-"They reckon up several sorts of pleasures, which they call true ones;
-some belong to the body, and others to the mind.  The pleasures of the
-mind lie in knowledge, and in that delight which the contemplation of
-truth carries with it; to which they add the joyful reflections on a well-
-spent life, and the assured hopes of a future happiness.  They divide the
-pleasures of the body into two sorts--the one is that which gives our
-senses some real delight, and is performed either by recruiting Nature
-and supplying those parts which feed the internal heat of life by eating
-and drinking, or when Nature is eased of any surcharge that oppresses it,
-when we are relieved from sudden pain, or that which arises from
-satisfying the appetite which Nature has wisely given to lead us to the
-propagation of the species.  There is another kind of pleasure that
-arises neither from our receiving what the body requires, nor its being
-relieved when overcharged, and yet, by a secret unseen virtue, affects
-the senses, raises the passions, and strikes the mind with generous
-impressions--this is, the pleasure that arises from music.  Another kind
-of bodily pleasure is that which results from an undisturbed and vigorous
-constitution of body, when life and active spirits seem to actuate every
-part.  This lively health, when entirely free from all mixture of pain,
-of itself gives an inward pleasure, independent of all external objects
-of delight; and though this pleasure does not so powerfully affect us,
-nor act so strongly on the senses as some of the others, yet it may be
-esteemed as the greatest of all pleasures; and almost all the Utopians
-reckon it the foundation and basis of all the other joys of life, since
-this alone makes the state of life easy and desirable, and when this is
-wanting, a man is really capable of no other pleasure.  They look upon
-freedom from pain, if it does not rise from perfect health, to be a state
-of stupidity rather than of pleasure.  This subject has been very
-narrowly canvassed among them, and it has been debated whether a firm and
-entire health could be called a pleasure or not.  Some have thought that
-there was no pleasure but what was 'excited' by some sensible motion in
-the body.  But this opinion has been long ago excluded from among them;
-so that now they almost universally agree that health is the greatest of
-all bodily pleasures; and that as there is a pain in sickness which is as
-opposite in its nature to pleasure as sickness itself is to health, so
-they hold that health is accompanied with pleasure.  And if any should
-say that sickness is not really pain, but that it only carries pain along
-with it, they look upon that as a fetch of subtlety that does not much
-alter the matter.  It is all one, in their opinion, whether it be said
-that health is in itself a pleasure, or that it begets a pleasure, as
-fire gives heat, so it be granted that all those whose health is entire
-have a true pleasure in the enjoyment of it.  And they reason thus:--'What
-is the pleasure of eating, but that a man's health, which had been
-weakened, does, with the assistance of food, drive away hunger, and so
-recruiting itself, recovers its former vigour?  And being thus refreshed
-it finds a pleasure in that conflict; and if the conflict is pleasure,
-the victory must yet breed a greater pleasure, except we fancy that it
-becomes stupid as soon as it has obtained that which it pursued, and so
-neither knows nor rejoices in its own welfare.'  If it is said that
-health cannot be felt, they absolutely deny it; for what man is in
-health, that does not perceive it when he is awake?  Is there any man
-that is so dull and stupid as not to acknowledge that he feels a delight
-in health?  And what is delight but another name for pleasure?
-
-"But, of all pleasures, they esteem those to be most valuable that lie in
-the mind, the chief of which arise out of true virtue and the witness of
-a good conscience.  They account health the chief pleasure that belongs
-to the body; for they think that the pleasure of eating and drinking, and
-all the other delights of sense, are only so far desirable as they give
-or maintain health; but they are not pleasant in themselves otherwise
-than as they resist those impressions that our natural infirmities are
-still making upon us.  For as a wise man desires rather to avoid diseases
-than to take physic, and to be freed from pain rather than to find ease
-by remedies, so it is more desirable not to need this sort of pleasure
-than to be obliged to indulge it.  If any man imagines that there is a
-real happiness in these enjoyments, he must then confess that he would be
-the happiest of all men if he were to lead his life in perpetual hunger,
-thirst, and itching, and, by consequence, in perpetual eating, drinking,
-and scratching himself; which any one may easily see would be not only a
-base, but a miserable, state of a life.  These are, indeed, the lowest of
-pleasures, and the least pure, for we can never relish them but when they
-are mixed with the contrary pains.  The pain of hunger must give us the
-pleasure of eating, and here the pain out-balances the pleasure.  And as
-the pain is more vehement, so it lasts much longer; for as it begins
-before the pleasure, so it does not cease but with the pleasure that
-extinguishes it, and both expire together.  They think, therefore, none
-of those pleasures are to be valued any further than as they are
-necessary; yet they rejoice in them, and with due gratitude acknowledge
-the tenderness of the great Author of Nature, who has planted in us
-appetites, by which those things that are necessary for our preservation
-are likewise made pleasant to us.  For how miserable a thing would life
-be if those daily diseases of hunger and thirst were to be carried off by
-such bitter drugs as we must use for those diseases that return seldomer
-upon us!  And thus these pleasant, as well as proper, gifts of Nature
-maintain the strength and the sprightliness of our bodies.
-
-"They also entertain themselves with the other delights let in at their
-eyes, their ears, and their nostrils as the pleasant relishes and
-seasoning of life, which Nature seems to have marked out peculiarly for
-man, since no other sort of animals contemplates the figure and beauty of
-the universe, nor is delighted with smells any further than as they
-distinguish meats by them; nor do they apprehend the concords or discords
-of sound.  Yet, in all pleasures whatsoever, they take care that a lesser
-joy does not hinder a greater, and that pleasure may never breed pain,
-which they think always follows dishonest pleasures.  But they think it
-madness for a man to wear out the beauty of his face or the force of his
-natural strength, to corrupt the sprightliness of his body by sloth and
-laziness, or to waste it by fasting; that it is madness to weaken the
-strength of his constitution and reject the other delights of life,
-unless by renouncing his own satisfaction he can either serve the public
-or promote the happiness of others, for which he expects a greater
-recompense from God.  So that they look on such a course of life as the
-mark of a mind that is both cruel to itself and ungrateful to the Author
-of Nature, as if we would not be beholden to Him for His favours, and
-therefore rejects all His blessings; as one who should afflict himself
-for the empty shadow of virtue, or for no better end than to render
-himself capable of bearing those misfortunes which possibly will never
-happen.
-
-"This is their notion of virtue and of pleasure: they think that no man's
-reason can carry him to a truer idea of them unless some discovery from
-heaven should inspire him with sublimer notions.  I have not now the
-leisure to examine whether they think right or wrong in this matter; nor
-do I judge it necessary, for I have only undertaken to give you an
-account of their constitution, but not to defend all their principles.  I
-am sure that whatever may be said of their notions, there is not in the
-whole world either a better people or a happier government.  Their bodies
-are vigorous and lively; and though they are but of a middle stature, and
-have neither the fruitfullest soil nor the purest air in the world; yet
-they fortify themselves so well, by their temperate course of life,
-against the unhealthiness of their air, and by their industry they so
-cultivate their soil, that there is nowhere to be seen a greater
-increase, both of corn and cattle, nor are there anywhere healthier men
-and freer from diseases; for one may there see reduced to practice not
-only all the art that the husbandman employs in manuring and improving an
-ill soil, but whole woods plucked up by the roots, and in other places
-new ones planted, where there were none before.  Their principal motive
-for this is the convenience of carriage, that their timber may be either
-near their towns or growing on the banks of the sea, or of some rivers,
-so as to be floated to them; for it is a harder work to carry wood at any
-distance over land than corn.  The people are industrious, apt to learn,
-as well as cheerful and pleasant, and none can endure more labour when it
-is necessary; but, except in that case, they love their ease.  They are
-unwearied pursuers of knowledge; for when we had given them some hints of
-the learning and discipline of the Greeks, concerning whom we only
-instructed them (for we know that there was nothing among the Romans,
-except their historians and their poets, that they would value much), it
-was strange to see how eagerly they were set on learning that language:
-we began to read a little of it to them, rather in compliance with their
-importunity than out of any hopes of their reaping from it any great
-advantage: but, after a very short trial, we found they made such
-progress, that we saw our labour was like to be more successful than we
-could have expected: they learned to write their characters and to
-pronounce their language so exactly, had so quick an apprehension, they
-remembered it so faithfully, and became so ready and correct in the use
-of it, that it would have looked like a miracle if the greater part of
-those whom we taught had not been men both of extraordinary capacity and
-of a fit age for instruction: they were, for the greatest part, chosen
-from among their learned men by their chief council, though some studied
-it of their own accord.  In three years' time they became masters of the
-whole language, so that they read the best of the Greek authors very
-exactly.  I am, indeed, apt to think that they learned that language the
-more easily from its having some relation to their own.  I believe that
-they were a colony of the Greeks; for though their language comes nearer
-the Persian, yet they retain many names, both for their towns and
-magistrates, that are of Greek derivation.  I happened to carry a great
-many books with me, instead of merchandise, when I sailed my fourth
-voyage; for I was so far from thinking of soon coming back, that I rather
-thought never to have returned at all, and I gave them all my books,
-among which were many of Plato's and some of Aristotle's works: I had
-also Theophrastus on Plants, which, to my great regret, was imperfect;
-for having laid it carelessly by, while we were at sea, a monkey had
-seized upon it, and in many places torn out the leaves.  They have no
-books of grammar but Lascares, for I did not carry Theodorus with me; nor
-have they any dictionaries but Hesichius and Dioscerides.  They esteem
-Plutarch highly, and were much taken with Lucian's wit and with his
-pleasant way of writing.  As for the poets, they have Aristophanes,
-Homer, Euripides, and Sophocles of Aldus's edition; and for historians,
-Thucydides, Herodotus, and Herodian.  One of my companions, Thricius
-Apinatus, happened to carry with him some of Hippocrates's works and
-Galen's Microtechne, which they hold in great estimation; for though
-there is no nation in the world that needs physic so little as they do,
-yet there is not any that honours it so much; they reckon the knowledge
-of it one of the pleasantest and most profitable parts of philosophy, by
-which, as they search into the secrets of nature, so they not only find
-this study highly agreeable, but think that such inquiries are very
-acceptable to the Author of nature; and imagine, that as He, like the
-inventors of curious engines amongst mankind, has exposed this great
-machine of the universe to the view of the only creatures capable of
-contemplating it, so an exact and curious observer, who admires His
-workmanship, is much more acceptable to Him than one of the herd, who,
-like a beast incapable of reason, looks on this glorious scene with the
-eyes of a dull and unconcerned spectator.
-
-"The minds of the Utopians, when fenced with a love for learning, are
-very ingenious in discovering all such arts as are necessary to carry it
-to perfection.  Two things they owe to us, the manufacture of paper and
-the art of printing; yet they are not so entirely indebted to us for
-these discoveries but that a great part of the invention was their own.
-We showed them some books printed by Aldus, we explained to them the way
-of making paper and the mystery of printing; but, as we had never
-practised these arts, we described them in a crude and superficial
-manner.  They seized the hints we gave them; and though at first they
-could not arrive at perfection, yet by making many essays they at last
-found out and corrected all their errors and conquered every difficulty.
-Before this they only wrote on parchment, on reeds, or on the barks of
-trees; but now they have established the manufactures of paper and set up
-printing presses, so that, if they had but a good number of Greek
-authors, they would be quickly supplied with many copies of them: at
-present, though they have no more than those I have mentioned, yet, by
-several impressions, they have multiplied them into many thousands.  If
-any man was to go among them that had some extraordinary talent, or that
-by much travelling had observed the customs of many nations (which made
-us to be so well received), he would receive a hearty welcome, for they
-are very desirous to know the state of the whole world.  Very few go
-among them on the account of traffic; for what can a man carry to them
-but iron, or gold, or silver? which merchants desire rather to export
-than import to a strange country: and as for their exportation, they
-think it better to manage that themselves than to leave it to foreigners,
-for by this means, as they understand the state of the neighbouring
-countries better, so they keep up the art of navigation which cannot be
-maintained but by much practice.
-
-
-
-OF THEIR SLAVES, AND OF THEIR MARRIAGES
-
-
-"They do not make slaves of prisoners of war, except those that are taken
-in battle, nor of the sons of their slaves, nor of those of other
-nations: the slaves among them are only such as are condemned to that
-state of life for the commission of some crime, or, which is more common,
-such as their merchants find condemned to die in those parts to which
-they trade, whom they sometimes redeem at low rates, and in other places
-have them for nothing.  They are kept at perpetual labour, and are always
-chained, but with this difference, that their own natives are treated
-much worse than others: they are considered as more profligate than the
-rest, and since they could not be restrained by the advantages of so
-excellent an education, are judged worthy of harder usage.  Another sort
-of slaves are the poor of the neighbouring countries, who offer of their
-own accord to come and serve them: they treat these better, and use them
-in all other respects as well as their own countrymen, except their
-imposing more labour upon them, which is no hard task to those that have
-been accustomed to it; and if any of these have a mind to go back to
-their own country, which, indeed, falls out but seldom, as they do not
-force them to stay, so they do not send them away empty-handed.
-
-"I have already told you with what care they look after their sick, so
-that nothing is left undone that can contribute either to their case or
-health; and for those who are taken with fixed and incurable diseases,
-they use all possible ways to cherish them and to make their lives as
-comfortable as possible.  They visit them often and take great pains to
-make their time pass off easily; but when any is taken with a torturing
-and lingering pain, so that there is no hope either of recovery or ease,
-the priests and magistrates come and exhort them, that, since they are
-now unable to go on with the business of life, are become a burden to
-themselves and to all about them, and they have really out-lived
-themselves, they should no longer nourish such a rooted distemper, but
-choose rather to die since they cannot live but in much misery; being
-assured that if they thus deliver themselves from torture, or are willing
-that others should do it, they shall be happy after death: since, by
-their acting thus, they lose none of the pleasures, but only the troubles
-of life, they think they behave not only reasonably but in a manner
-consistent with religion and piety; because they follow the advice given
-them by their priests, who are the expounders of the will of God.  Such
-as are wrought on by these persuasions either starve themselves of their
-own accord, or take opium, and by that means die without pain.  But no
-man is forced on this way of ending his life; and if they cannot be
-persuaded to it, this does not induce them to fail in their attendance
-and care of them: but as they believe that a voluntary death, when it is
-chosen upon such an authority, is very honourable, so if any man takes
-away his own life without the approbation of the priests and the senate,
-they give him none of the honours of a decent funeral, but throw his body
-into a ditch.
-
-"Their women are not married before eighteen nor their men before two-and-
-twenty, and if any of them run into forbidden embraces before marriage
-they are severely punished, and the privilege of marriage is denied them
-unless they can obtain a special warrant from the Prince.  Such disorders
-cast a great reproach upon the master and mistress of the family in which
-they happen, for it is supposed that they have failed in their duty.  The
-reason of punishing this so severely is, because they think that if they
-were not strictly restrained from all vagrant appetites, very few would
-engage in a state in which they venture the quiet of their whole lives,
-by being confined to one person, and are obliged to endure all the
-inconveniences with which it is accompanied.  In choosing their wives
-they use a method that would appear to us very absurd and ridiculous, but
-it is constantly observed among them, and is accounted perfectly
-consistent with wisdom.  Before marriage some grave matron presents the
-bride, naked, whether she is a virgin or a widow, to the bridegroom, and
-after that some grave man presents the bridegroom, naked, to the bride.
-We, indeed, both laughed at this, and condemned it as very indecent.  But
-they, on the other hand, wondered at the folly of the men of all other
-nations, who, if they are but to buy a horse of a small value, are so
-cautious that they will see every part of him, and take off both his
-saddle and all his other tackle, that there may be no secret ulcer hid
-under any of them, and that yet in the choice of a wife, on which depends
-the happiness or unhappiness of the rest of his life, a man should
-venture upon trust, and only see about a handsbreadth of the face, all
-the rest of the body being covered, under which may lie hid what may be
-contagious as well as loathsome.  All men are not so wise as to choose a
-woman only for her good qualities, and even wise men consider the body as
-that which adds not a little to the mind, and it is certain there may be
-some such deformity covered with clothes as may totally alienate a man
-from his wife, when it is too late to part with her; if such a thing is
-discovered after marriage a man has no remedy but patience; they,
-therefore, think it is reasonable that there should be good provision
-made against such mischievous frauds.
-
-"There was so much the more reason for them to make a regulation in this
-matter, because they are the only people of those parts that neither
-allow of polygamy nor of divorces, except in the case of adultery or
-insufferable perverseness, for in these cases the Senate dissolves the
-marriage and grants the injured person leave to marry again; but the
-guilty are made infamous and are never allowed the privilege of a second
-marriage.  None are suffered to put away their wives against their wills,
-from any great calamity that may have fallen on their persons, for they
-look on it as the height of cruelty and treachery to abandon either of
-the married persons when they need most the tender care of their consort,
-and that chiefly in the case of old age, which, as it carries many
-diseases along with it, so it is a disease of itself.  But it frequently
-falls out that when a married couple do not well agree, they, by mutual
-consent, separate, and find out other persons with whom they hope they
-may live more happily; yet this is not done without obtaining leave of
-the Senate, which never admits of a divorce but upon a strict inquiry
-made, both by the senators and their wives, into the grounds upon which
-it is desired, and even when they are satisfied concerning the reasons of
-it they go on but slowly, for they imagine that too great easiness in
-granting leave for new marriages would very much shake the kindness of
-married people.  They punish severely those that defile the marriage bed;
-if both parties are married they are divorced, and the injured persons
-may marry one another, or whom they please, but the adulterer and the
-adulteress are condemned to slavery, yet if either of the injured persons
-cannot shake off the love of the married person they may live with them
-still in that state, but they must follow them to that labour to which
-the slaves are condemned, and sometimes the repentance of the condemned,
-together with the unshaken kindness of the innocent and injured person,
-has prevailed so far with the Prince that he has taken off the sentence;
-but those that relapse after they are once pardoned are punished with
-death.
-
-"Their law does not determine the punishment for other crimes, but that
-is left to the Senate, to temper it according to the circumstances of the
-fact.  Husbands have power to correct their wives and parents to chastise
-their children, unless the fault is so great that a public punishment is
-thought necessary for striking terror into others.  For the most part
-slavery is the punishment even of the greatest crimes, for as that is no
-less terrible to the criminals themselves than death, so they think the
-preserving them in a state of servitude is more for the interest of the
-commonwealth than killing them, since, as their labour is a greater
-benefit to the public than their death could be, so the sight of their
-misery is a more lasting terror to other men than that which would be
-given by their death.  If their slaves rebel, and will not bear their
-yoke and submit to the labour that is enjoined them, they are treated as
-wild beasts that cannot be kept in order, neither by a prison nor by
-their chains, and are at last put to death.  But those who bear their
-punishment patiently, and are so much wrought on by that pressure that
-lies so hard on them, that it appears they are really more troubled for
-the crimes they have committed than for the miseries they suffer, are not
-out of hope, but that, at last, either the Prince will, by his
-prerogative, or the people, by their intercession, restore them again to
-their liberty, or, at least, very much mitigate their slavery.  He that
-tempts a married woman to adultery is no less severely punished than he
-that commits it, for they believe that a deliberate design to commit a
-crime is equal to the fact itself, since its not taking effect does not
-make the person that miscarried in his attempt at all the less guilty.
-
-"They take great pleasure in fools, and as it is thought a base and
-unbecoming thing to use them ill, so they do not think it amiss for
-people to divert themselves with their folly; and, in their opinion, this
-is a great advantage to the fools themselves; for if men were so sullen
-and severe as not at all to please themselves with their ridiculous
-behaviour and foolish sayings, which is all that they can do to recommend
-themselves to others, it could not be expected that they would be so well
-provided for nor so tenderly used as they must otherwise be.  If any man
-should reproach another for his being misshaped or imperfect in any part
-of his body, it would not at all be thought a reflection on the person so
-treated, but it would be accounted scandalous in him that had upbraided
-another with what he could not help.  It is thought a sign of a sluggish
-and sordid mind not to preserve carefully one's natural beauty; but it is
-likewise infamous among them to use paint.  They all see that no beauty
-recommends a wife so much to her husband as the probity of her life and
-her obedience; for as some few are caught and held only by beauty, so all
-are attracted by the other excellences which charm all the world.
-
-"As they fright men from committing crimes by punishments, so they invite
-them to the love of virtue by public honours; therefore they erect
-statues to the memories of such worthy men as have deserved well of their
-country, and set these in their market-places, both to perpetuate the
-remembrance of their actions and to be an incitement to their posterity
-to follow their example.
-
-"If any man aspires to any office he is sure never to compass it.  They
-all live easily together, for none of the magistrates are either insolent
-or cruel to the people; they affect rather to be called fathers, and, by
-being really so, they well deserve the name; and the people pay them all
-the marks of honour the more freely because none are exacted from them.
-The Prince himself has no distinction, either of garments or of a crown;
-but is only distinguished by a sheaf of corn carried before him; as the
-High Priest is also known by his being preceded by a person carrying a
-wax light.
-
-"They have but few laws, and such is their constitution that they need
-not many.  They very much condemn other nations whose laws, together with
-the commentaries on them, swell up to so many volumes; for they think it
-an unreasonable thing to oblige men to obey a body of laws that are both
-of such a bulk, and so dark as not to be read and understood by every one
-of the subjects.
-
-"They have no lawyers among them, for they consider them as a sort of
-people whose profession it is to disguise matters and to wrest the laws,
-and, therefore, they think it is much better that every man should plead
-his own cause, and trust it to the judge, as in other places the client
-trusts it to a counsellor; by this means they both cut off many delays
-and find out truth more certainly; for after the parties have laid open
-the merits of the cause, without those artifices which lawyers are apt to
-suggest, the judge examines the whole matter, and supports the simplicity
-of such well-meaning persons, whom otherwise crafty men would be sure to
-run down; and thus they avoid those evils which appear very remarkably
-among all those nations that labour under a vast load of laws.  Every one
-of them is skilled in their law; for, as it is a very short study, so the
-plainest meaning of which words are capable is always the sense of their
-laws; and they argue thus: all laws are promulgated for this end, that
-every man may know his duty; and, therefore, the plainest and most
-obvious sense of the words is that which ought to be put upon them, since
-a more refined exposition cannot be easily comprehended, and would only
-serve to make the laws become useless to the greater part of mankind, and
-especially to those who need most the direction of them; for it is all
-one not to make a law at all or to couch it in such terms that, without a
-quick apprehension and much study, a man cannot find out the true meaning
-of it, since the generality of mankind are both so dull, and so much
-employed in their several trades, that they have neither the leisure nor
-the capacity requisite for such an inquiry.
-
-"Some of their neighbours, who are masters of their own liberties (having
-long ago, by the assistance of the Utopians, shaken off the yoke of
-tyranny, and being much taken with those virtues which they observe among
-them), have come to desire that they would send magistrates to govern
-them, some changing them every year, and others every five years; at the
-end of their government they bring them back to Utopia, with great
-expressions of honour and esteem, and carry away others to govern in
-their stead.  In this they seem to have fallen upon a very good expedient
-for their own happiness and safety; for since the good or ill condition
-of a nation depends so much upon their magistrates, they could not have
-made a better choice than by pitching on men whom no advantages can bias;
-for wealth is of no use to them, since they must so soon go back to their
-own country, and they, being strangers among them, are not engaged in any
-of their heats or animosities; and it is certain that when public
-judicatories are swayed, either by avarice or partial affections, there
-must follow a dissolution of justice, the chief sinew of society.
-
-"The Utopians call those nations that come and ask magistrates from them
-Neighbours; but those to whom they have been of more particular service,
-Friends; and as all other nations are perpetually either making leagues
-or breaking them, they never enter into an alliance with any state.  They
-think leagues are useless things, and believe that if the common ties of
-humanity do not knit men together, the faith of promises will have no
-great effect; and they are the more confirmed in this by what they see
-among the nations round about them, who are no strict observers of
-leagues and treaties.  We know how religiously they are observed in
-Europe, more particularly where the Christian doctrine is received, among
-whom they are sacred and inviolable! which is partly owing to the justice
-and goodness of the princes themselves, and partly to the reverence they
-pay to the popes, who, as they are the most religious observers of their
-own promises, so they exhort all other princes to perform theirs, and,
-when fainter methods do not prevail, they compel them to it by the
-severity of the pastoral censure, and think that it would be the most
-indecent thing possible if men who are particularly distinguished by the
-title of 'The Faithful' should not religiously keep the faith of their
-treaties.  But in that new-found world, which is not more distant from us
-in situation than the people are in their manners and course of life,
-there is no trusting to leagues, even though they were made with all the
-pomp of the most sacred ceremonies; on the contrary, they are on this
-account the sooner broken, some slight pretence being found in the words
-of the treaties, which are purposely couched in such ambiguous terms that
-they can never be so strictly bound but they will always find some
-loophole to escape at, and thus they break both their leagues and their
-faith; and this is done with such impudence, that those very men who
-value themselves on having suggested these expedients to their princes
-would, with a haughty scorn, declaim against such craft; or, to speak
-plainer, such fraud and deceit, if they found private men make use of it
-in their bargains, and would readily say that they deserved to be hanged.
-
-"By this means it is that all sort of justice passes in the world for a
-low-spirited and vulgar virtue, far below the dignity of royal
-greatness--or at least there are set up two sorts of justice; the one is
-mean and creeps on the ground, and, therefore, becomes none but the lower
-part of mankind, and so must be kept in severely by many restraints, that
-it may not break out beyond the bounds that are set to it; the other is
-the peculiar virtue of princes, which, as it is more majestic than that
-which becomes the rabble, so takes a freer compass, and thus lawful and
-unlawful are only measured by pleasure and interest.  These practices of
-the princes that lie about Utopia, who make so little account of their
-faith, seem to be the reasons that determine them to engage in no
-confederacy.  Perhaps they would change their mind if they lived among
-us; but yet, though treaties were more religiously observed, they would
-still dislike the custom of making them, since the world has taken up a
-false maxim upon it, as if there were no tie of nature uniting one nation
-to another, only separated perhaps by a mountain or a river, and that all
-were born in a state of hostility, and so might lawfully do all that
-mischief to their neighbours against which there is no provision made by
-treaties; and that when treaties are made they do not cut off the enmity
-or restrain the licence of preying upon each other, if, by the
-unskilfulness of wording them, there are not effectual provisoes made
-against them; they, on the other hand, judge that no man is to be
-esteemed our enemy that has never injured us, and that the partnership of
-human nature is instead of a league; and that kindness and good nature
-unite men more effectually and with greater strength than any agreements
-whatsoever, since thereby the engagements of men's hearts become stronger
-than the bond and obligation of words.
-
-
-
-OF THEIR MILITARY DISCIPLINE
-
-
-They detest war as a very brutal thing, and which, to the reproach of
-human nature, is more practised by men than by any sort of beasts.  They,
-in opposition to the sentiments of almost all other nations, think that
-there is nothing more inglorious than that glory that is gained by war;
-and therefore, though they accustom themselves daily to military
-exercises and the discipline of war, in which not only their men, but
-their women likewise, are trained up, that, in cases of necessity, they
-may not be quite useless, yet they do not rashly engage in war, unless it
-be either to defend themselves or their friends from any unjust
-aggressors, or, out of good nature or in compassion, assist an oppressed
-nation in shaking off the yoke of tyranny.  They, indeed, help their
-friends not only in defensive but also in offensive wars; but they never
-do that unless they had been consulted before the breach was made, and,
-being satisfied with the grounds on which they went, they had found that
-all demands of reparation were rejected, so that a war was unavoidable.
-This they think to be not only just when one neighbour makes an inroad on
-another by public order, and carries away the spoils, but when the
-merchants of one country are oppressed in another, either under pretence
-of some unjust laws, or by the perverse wresting of good ones.  This they
-count a juster cause of war than the other, because those injuries are
-done under some colour of laws.  This was the only ground of that war in
-which they engaged with the Nephelogetes against the Aleopolitanes, a
-little before our time; for the merchants of the former having, as they
-thought, met with great injustice among the latter, which (whether it was
-in itself right or wrong) drew on a terrible war, in which many of their
-neighbours were engaged; and their keenness in carrying it on being
-supported by their strength in maintaining it, it not only shook some
-very flourishing states and very much afflicted others, but, after a
-series of much mischief ended in the entire conquest and slavery of the
-Aleopolitanes, who, though before the war they were in all respects much
-superior to the Nephelogetes, were yet subdued; but, though the Utopians
-had assisted them in the war, yet they pretended to no share of the
-spoil.
-
-"But, though they so vigorously assist their friends in obtaining
-reparation for the injuries they have received in affairs of this nature,
-yet, if any such frauds were committed against themselves, provided no
-violence was done to their persons, they would only, on their being
-refused satisfaction, forbear trading with such a people.  This is not
-because they consider their neighbours more than their own citizens; but,
-since their neighbours trade every one upon his own stock, fraud is a
-more sensible injury to them than it is to the Utopians, among whom the
-public, in such a case, only suffers, as they expect no thing in return
-for the merchandise they export but that in which they so much abound,
-and is of little use to them, the loss does not much affect them.  They
-think, therefore, it would be too severe to revenge a loss attended with
-so little inconvenience, either to their lives or their subsistence, with
-the death of many persons; but if any of their people are either killed
-or wounded wrongfully, whether it be done by public authority, or only by
-private men, as soon as they hear of it they send ambassadors, and demand
-that the guilty persons may be delivered up to them, and if that is
-denied, they declare war; but if it be complied with, the offenders are
-condemned either to death or slavery.
-
-"They would be both troubled and ashamed of a bloody victory over their
-enemies; and think it would be as foolish a purchase as to buy the most
-valuable goods at too high a rate.  And in no victory do they glory so
-much as in that which is gained by dexterity and good conduct without
-bloodshed.  In such cases they appoint public triumphs, and erect
-trophies to the honour of those who have succeeded; for then do they
-reckon that a man acts suitably to his nature, when he conquers his enemy
-in such a way as that no other creature but a man could be capable of,
-and that is by the strength of his understanding.  Bears, lions, boars,
-wolves, and dogs, and all other animals, employ their bodily force one
-against another, in which, as many of them are superior to men, both in
-strength and fierceness, so they are all subdued by his reason and
-understanding.
-
-"The only design of the Utopians in war is to obtain that by force which,
-if it had been granted them in time, would have prevented the war; or, if
-that cannot be done, to take so severe a revenge on those that have
-injured them that they may be terrified from doing the like for the time
-to come.  By these ends they measure all their designs, and manage them
-so, that it is visible that the appetite of fame or vainglory does not
-work so much on there as a just care of their own security.
-
-"As soon as they declare war, they take care to have a great many
-schedules, that are sealed with their common seal, affixed in the most
-conspicuous places of their enemies' country.  This is carried secretly,
-and done in many places all at once.  In these they promise great rewards
-to such as shall kill the prince, and lesser in proportion to such as
-shall kill any other persons who are those on whom, next to the prince
-himself, they cast the chief balance of the war.  And they double the sum
-to him that, instead of killing the person so marked out, shall take him
-alive, and put him in their hands.  They offer not only indemnity, but
-rewards, to such of the persons themselves that are so marked, if they
-will act against their countrymen.  By this means those that are named in
-their schedules become not only distrustful of their fellow-citizens, but
-are jealous of one another, and are much distracted by fear and danger;
-for it has often fallen out that many of them, and even the prince
-himself, have been betrayed, by those in whom they have trusted most; for
-the rewards that the Utopians offer are so immeasurably great, that there
-is no sort of crime to which men cannot be drawn by them.  They consider
-the risk that those run who undertake such services, and offer a
-recompense proportioned to the danger--not only a vast deal of gold, but
-great revenues in lands, that lie among other nations that are their
-friends, where they may go and enjoy them very securely; and they observe
-the promises they make of their kind most religiously.  They very much
-approve of this way of corrupting their enemies, though it appears to
-others to be base and cruel; but they look on it as a wise course, to
-make an end of what would be otherwise a long war, without so much as
-hazarding one battle to decide it.  They think it likewise an act of
-mercy and love to mankind to prevent the great slaughter of those that
-must otherwise be killed in the progress of the war, both on their own
-side and on that of their enemies, by the death of a few that are most
-guilty; and that in so doing they are kind even to their enemies, and
-pity them no less than their own people, as knowing that the greater part
-of them do not engage in the war of their own accord, but are driven into
-it by the passions of their prince.
-
-"If this method does not succeed with them, then they sow seeds of
-contention among their enemies, and animate the prince's brother, or some
-of the nobility, to aspire to the crown.  If they cannot disunite them by
-domestic broils, then they engage their neighbours against them, and make
-them set on foot some old pretensions, which are never wanting to princes
-when they have occasion for them.  These they plentifully supply with
-money, though but very sparingly with any auxiliary troops; for they are
-so tender of their own people that they would not willingly exchange one
-of them, even with the prince of their enemies' country.
-
-"But as they keep their gold and silver only for such an occasion, so,
-when that offers itself, they easily part with it; since it would be no
-convenience to them, though they should reserve nothing of it to
-themselves.  For besides the wealth that they have among them at home,
-they have a vast treasure abroad; many nations round about them being
-deep in their debt: so that they hire soldiers from all places for
-carrying on their wars; but chiefly from the Zapolets, who live five
-hundred miles east of Utopia.  They are a rude, wild, and fierce nation,
-who delight in the woods and rocks, among which they were born and bred
-up.  They are hardened both against heat, cold, and labour, and know
-nothing of the delicacies of life.  They do not apply themselves to
-agriculture, nor do they care either for their houses or their clothes:
-cattle is all that they look after; and for the greatest part they live
-either by hunting or upon rapine; and are made, as it were, only for war.
-They watch all opportunities of engaging in it, and very readily embrace
-such as are offered them.  Great numbers of them will frequently go out,
-and offer themselves for a very low pay, to serve any that will employ
-them: they know none of the arts of life, but those that lead to the
-taking it away; they serve those that hire them, both with much courage
-and great fidelity; but will not engage to serve for any determined time,
-and agree upon such terms, that the next day they may go over to the
-enemies of those whom they serve if they offer them a greater
-encouragement; and will, perhaps, return to them the day after that upon
-a higher advance of their pay.  There are few wars in which they make not
-a considerable part of the armies of both sides: so it often falls out
-that they who are related, and were hired in the same country, and so
-have lived long and familiarly together, forgetting both their relations
-and former friendship, kill one another upon no other consideration than
-that of being hired to it for a little money by princes of different
-interests; and such a regard have they for money that they are easily
-wrought on by the difference of one penny a day to change sides.  So
-entirely does their avarice influence them; and yet this money, which
-they value so highly, is of little use to them; for what they purchase
-thus with their blood they quickly waste on luxury, which among them is
-but of a poor and miserable form.
-
-"This nation serves the Utopians against all people whatsoever, for they
-pay higher than any other.  The Utopians hold this for a maxim, that as
-they seek out the best sort of men for their own use at home, so they
-make use of this worst sort of men for the consumption of war; and
-therefore they hire them with the offers of vast rewards to expose
-themselves to all sorts of hazards, out of which the greater part never
-returns to claim their promises; yet they make them good most religiously
-to such as escape.  This animates them to adventure again, whenever there
-is occasion for it; for the Utopians are not at all troubled how many of
-these happen to be killed, and reckon it a service done to mankind if
-they could be a means to deliver the world from such a lewd and vicious
-sort of people, that seem to have run together, as to the drain of human
-nature.  Next to these, they are served in their wars with those upon
-whose account they undertake them, and with the auxiliary troops of their
-other friends, to whom they join a few of their own people, and send some
-man of eminent and approved virtue to command in chief.  There are two
-sent with him, who, during his command, are but private men, but the
-first is to succeed him if he should happen to be either killed or taken;
-and, in case of the like misfortune to him, the third comes in his place;
-and thus they provide against all events, that such accidents as may
-befall their generals may not endanger their armies.  When they draw out
-troops of their own people, they take such out of every city as freely
-offer themselves, for none are forced to go against their wills, since
-they think that if any man is pressed that wants courage, he will not
-only act faintly, but by his cowardice dishearten others.  But if an
-invasion is made on their country, they make use of such men, if they
-have good bodies, though they are not brave; and either put them aboard
-their ships, or place them on the walls of their towns, that being so
-posted, they may find no opportunity of flying away; and thus either
-shame, the heat of action, or the impossibility of flying, bears down
-their cowardice; they often make a virtue of necessity, and behave
-themselves well, because nothing else is left them.  But as they force no
-man to go into any foreign war against his will, so they do not hinder
-those women who are willing to go along with their husbands; on the
-contrary, they encourage and praise them, and they stand often next their
-husbands in the front of the army.  They also place together those who
-are related, parents, and children, kindred, and those that are mutually
-allied, near one another; that those whom nature has inspired with the
-greatest zeal for assisting one another may be the nearest and readiest
-to do it; and it is matter of great reproach if husband or wife survive
-one another, or if a child survives his parent, and therefore when they
-come to be engaged in action, they continue to fight to the last man, if
-their enemies stand before them: and as they use all prudent methods to
-avoid the endangering their own men, and if it is possible let all the
-action and danger fall upon the troops that they hire, so if it becomes
-necessary for themselves to engage, they then charge with as much courage
-as they avoided it before with prudence: nor is it a fierce charge at
-first, but it increases by degrees; and as they continue in action, they
-grow more obstinate, and press harder upon the enemy, insomuch that they
-will much sooner die than give ground; for the certainty that their
-children will be well looked after when they are dead frees them from all
-that anxiety concerning them which often masters men of great courage;
-and thus they are animated by a noble and invincible resolution.  Their
-skill in military affairs increases their courage: and the wise
-sentiments which, according to the laws of their country, are instilled
-into them in their education, give additional vigour to their minds: for
-as they do not undervalue life so as prodigally to throw it away, they
-are not so indecently fond of it as to preserve it by base and unbecoming
-methods.  In the greatest heat of action the bravest of their youth, who
-have devoted themselves to that service, single out the general of their
-enemies, set on him either openly or by ambuscade; pursue him everywhere,
-and when spent and wearied out, are relieved by others, who never give
-over the pursuit, either attacking him with close weapons when they can
-get near him, or with those which wound at a distance, when others get in
-between them.  So that, unless he secures himself by flight, they seldom
-fail at last to kill or to take him prisoner.  When they have obtained a
-victory, they kill as few as possible, and are much more bent on taking
-many prisoners than on killing those that fly before them.  Nor do they
-ever let their men so loose in the pursuit of their enemies as not to
-retain an entire body still in order; so that if they have been forced to
-engage the last of their battalions before they could gain the day, they
-will rather let their enemies all escape than pursue them when their own
-army is in disorder; remembering well what has often fallen out to
-themselves, that when the main body of their army has been quite defeated
-and broken, when their enemies, imagining the victory obtained, have let
-themselves loose into an irregular pursuit, a few of them that lay for a
-reserve, waiting a fit opportunity, have fallen on them in their chase,
-and when straggling in disorder, and apprehensive of no danger, but
-counting the day their own, have turned the whole action, and, wresting
-out of their hands a victory that seemed certain and undoubted, while the
-vanquished have suddenly become victorious.
-
-"It is hard to tell whether they are more dexterous in laying or avoiding
-ambushes.  They sometimes seem to fly when it is far from their thoughts;
-and when they intend to give ground, they do it so that it is very hard
-to find out their design.  If they see they are ill posted, or are like
-to be overpowered by numbers, they then either march off in the night
-with great silence, or by some stratagem delude their enemies.  If they
-retire in the day-time, they do it in such order that it is no less
-dangerous to fall upon them in a retreat than in a march.  They fortify
-their camps with a deep and large trench; and throw up the earth that is
-dug out of it for a wall; nor do they employ only their slaves in this,
-but the whole army works at it, except those that are then upon the
-guard; so that when so many hands are at work, a great line and a strong
-fortification is finished in so short a time that it is scarce credible.
-Their armour is very strong for defence, and yet is not so heavy as to
-make them uneasy in their marches; they can even swim with it.  All that
-are trained up to war practise swimming.  Both horse and foot make great
-use of arrows, and are very expert.  They have no swords, but fight with
-a pole-axe that is both sharp and heavy, by which they thrust or strike
-down an enemy.  They are very good at finding out warlike machines, and
-disguise them so well that the enemy does not perceive them till he feels
-the use of them; so that he cannot prepare such a defence as would render
-them useless; the chief consideration had in the making them is that they
-may be easily carried and managed.
-
-"If they agree to a truce, they observe it so religiously that no
-provocations will make them break it.  They never lay their enemies'
-country waste nor burn their corn, and even in their marches they take
-all possible care that neither horse nor foot may tread it down, for they
-do not know but that they may have use for it themselves.  They hurt no
-man whom they find disarmed, unless he is a spy.  When a town is
-surrendered to them, they take it into their protection; and when they
-carry a place by storm they never plunder it, but put those only to the
-sword that oppose the rendering of it up, and make the rest of the
-garrison slaves, but for the other inhabitants, they do them no hurt; and
-if any of them had advised a surrender, they give them good rewards out
-of the estates of those that they condemn, and distribute the rest among
-their auxiliary troops, but they themselves take no share of the spoil.
-
-"When a war is ended, they do not oblige their friends to reimburse their
-expenses; but they obtain them of the conquered, either in money, which
-they keep for the next occasion, or in lands, out of which a constant
-revenue is to be paid them; by many increases the revenue which they draw
-out from several countries on such occasions is now risen to above
-700,000 ducats a year.  They send some of their own people to receive
-these revenues, who have orders to live magnificently and like princes,
-by which means they consume much of it upon the place; and either bring
-over the rest to Utopia or lend it to that nation in which it lies.  This
-they most commonly do, unless some great occasion, which falls out but
-very seldom, should oblige them to call for it all.  It is out of these
-lands that they assign rewards to such as they encourage to adventure on
-desperate attempts.  If any prince that engages in war with them is
-making preparations for invading their country, they prevent him, and
-make his country the seat of the war; for they do not willingly suffer
-any war to break in upon their island; and if that should happen, they
-would only defend themselves by their own people; but would not call for
-auxiliary troops to their assistance.
-
-
-
-OF THE RELIGIONS OF THE UTOPIANS
-
-
-"There are several sorts of religions, not only in different parts of the
-island, but even in every town; some worshipping the sun, others the moon
-or one of the planets.  Some worship such men as have been eminent in
-former times for virtue or glory, not only as ordinary deities, but as
-the supreme god.  Yet the greater and wiser sort of them worship none of
-these, but adore one eternal, invisible, infinite, and incomprehensible
-Deity; as a Being that is far above all our apprehensions, that is spread
-over the whole universe, not by His bulk, but by His power and virtue;
-Him they call the Father of All, and acknowledge that the beginnings, the
-increase, the progress, the vicissitudes, and the end of all things come
-only from Him; nor do they offer divine honours to any but to Him alone.
-And, indeed, though they differ concerning other things, yet all agree in
-this: that they think there is one Supreme Being that made and governs
-the world, whom they call, in the language of their country, Mithras.
-They differ in this: that one thinks the god whom he worships is this
-Supreme Being, and another thinks that his idol is that god; but they all
-agree in one principle, that whoever is this Supreme Being, He is also
-that great essence to whose glory and majesty all honours are ascribed by
-the consent of all nations.
-
-"By degrees they fall off from the various superstitions that are among
-them, and grow up to that one religion that is the best and most in
-request; and there is no doubt to be made, but that all the others had
-vanished long ago, if some of those who advised them to lay aside their
-superstitions had not met with some unhappy accidents, which, being
-considered as inflicted by heaven, made them afraid that the god whose
-worship had like to have been abandoned had interposed and revenged
-themselves on those who despised their authority.
-
-"After they had heard from us an account of the doctrine, the course of
-life, and the miracles of Christ, and of the wonderful constancy of so
-many martyrs, whose blood, so willingly offered up by them, was the chief
-occasion of spreading their religion over a vast number of nations, it is
-not to be imagined how inclined they were to receive it.  I shall not
-determine whether this proceeded from any secret inspiration of God, or
-whether it was because it seemed so favourable to that community of
-goods, which is an opinion so particular as well as so dear to them;
-since they perceived that Christ and His followers lived by that rule,
-and that it was still kept up in some communities among the sincerest
-sort of Christians.  From whichsoever of these motives it might be, true
-it is, that many of them came over to our religion, and were initiated
-into it by baptism.  But as two of our number were dead, so none of the
-four that survived were in priests' orders, we, therefore, could only
-baptise them, so that, to our great regret, they could not partake of the
-other sacraments, that can only be administered by priests, but they are
-instructed concerning them and long most vehemently for them.  They have
-had great disputes among themselves, whether one chosen by them to be a
-priest would not be thereby qualified to do all the things that belong to
-that character, even though he had no authority derived from the Pope,
-and they seemed to be resolved to choose some for that employment, but
-they had not done it when I left them.
-
-"Those among them that have not received our religion do not fright any
-from it, and use none ill that goes over to it, so that all the while I
-was there one man was only punished on this occasion.  He being newly
-baptised did, notwithstanding all that we could say to the contrary,
-dispute publicly concerning the Christian religion, with more zeal than
-discretion, and with so much heat, that he not only preferred our worship
-to theirs, but condemned all their rites as profane, and cried out
-against all that adhered to them as impious and sacrilegious persons,
-that were to be damned to everlasting burnings.  Upon his having
-frequently preached in this manner he was seized, and after trial he was
-condemned to banishment, not for having disparaged their religion, but
-for his inflaming the people to sedition; for this is one of their most
-ancient laws, that no man ought to be punished for his religion.  At the
-first constitution of their government, Utopus having understood that
-before his coming among them the old inhabitants had been engaged in
-great quarrels concerning religion, by which they were so divided among
-themselves, that he found it an easy thing to conquer them, since,
-instead of uniting their forces against him, every different party in
-religion fought by themselves.  After he had subdued them he made a law
-that every man might be of what religion he pleased, and might endeavour
-to draw others to it by the force of argument and by amicable and modest
-ways, but without bitterness against those of other opinions; but that he
-ought to use no other force but that of persuasion, and was neither to
-mix with it reproaches nor violence; and such as did otherwise were to be
-condemned to banishment or slavery.
-
-"This law was made by Utopus, not only for preserving the public peace,
-which he saw suffered much by daily contentions and irreconcilable heats,
-but because he thought the interest of religion itself required it.  He
-judged it not fit to determine anything rashly; and seemed to doubt
-whether those different forms of religion might not all come from God,
-who might inspire man in a different manner, and be pleased with this
-variety; he therefore thought it indecent and foolish for any man to
-threaten and terrify another to make him believe what did not appear to
-him to be true.  And supposing that only one religion was really true,
-and the rest false, he imagined that the native force of truth would at
-last break forth and shine bright, if supported only by the strength of
-argument, and attended to with a gentle and unprejudiced mind; while, on
-the other hand, if such debates were carried on with violence and
-tumults, as the most wicked are always the most obstinate, so the best
-and most holy religion might be choked with superstition, as corn is with
-briars and thorns; he therefore left men wholly to their liberty, that
-they might be free to believe as they should see cause; only he made a
-solemn and severe law against such as should so far degenerate from the
-dignity of human nature, as to think that our souls died with our bodies,
-or that the world was governed by chance, without a wise overruling
-Providence: for they all formerly believed that there was a state of
-rewards and punishments to the good and bad after this life; and they now
-look on those that think otherwise as scarce fit to be counted men, since
-they degrade so noble a being as the soul, and reckon it no better than a
-beast's: thus they are far from looking on such men as fit for human
-society, or to be citizens of a well-ordered commonwealth; since a man of
-such principles must needs, as oft as he dares do it, despise all their
-laws and customs: for there is no doubt to be made, that a man who is
-afraid of nothing but the law, and apprehends nothing after death, will
-not scruple to break through all the laws of his country, either by fraud
-or force, when by this means he may satisfy his appetites.  They never
-raise any that hold these maxims, either to honours or offices, nor
-employ them in any public trust, but despise them, as men of base and
-sordid minds.  Yet they do not punish them, because they lay this down as
-a maxim, that a man cannot make himself believe anything he pleases; nor
-do they drive any to dissemble their thoughts by threatenings, so that
-men are not tempted to lie or disguise their opinions; which being a sort
-of fraud, is abhorred by the Utopians: they take care indeed to prevent
-their disputing in defence of these opinions, especially before the
-common people: but they suffer, and even encourage them to dispute
-concerning them in private with their priest, and other grave men, being
-confident that they will be cured of those mad opinions by having reason
-laid before them.  There are many among them that run far to the other
-extreme, though it is neither thought an ill nor unreasonable opinion,
-and therefore is not at all discouraged.  They think that the souls of
-beasts are immortal, though far inferior to the dignity of the human
-soul, and not capable of so great a happiness.  They are almost all of
-them very firmly persuaded that good men will be infinitely happy in
-another state: so that though they are compassionate to all that are
-sick, yet they lament no man's death, except they see him loath to part
-with life; for they look on this as a very ill presage, as if the soul,
-conscious to itself of guilt, and quite hopeless, was afraid to leave the
-body, from some secret hints of approaching misery.  They think that such
-a man's appearance before God cannot be acceptable to Him, who being
-called on, does not go out cheerfully, but is backward and unwilling, and
-is as it were dragged to it.  They are struck with horror when they see
-any die in this manner, and carry them out in silence and with sorrow,
-and praying God that He would be merciful to the errors of the departed
-soul, they lay the body in the ground: but when any die cheerfully, and
-full of hope, they do not mourn for them, but sing hymns when they carry
-out their bodies, and commending their souls very earnestly to God: their
-whole behaviour is then rather grave than sad, they burn the body, and
-set up a pillar where the pile was made, with an inscription to the
-honour of the deceased.  When they come from the funeral, they discourse
-of his good life, and worthy actions, but speak of nothing oftener and
-with more pleasure than of his serenity at the hour of death.  They think
-such respect paid to the memory of good men is both the greatest
-incitement to engage others to follow their example, and the most
-acceptable worship that can be offered them; for they believe that though
-by the imperfection of human sight they are invisible to us, yet they are
-present among us, and hear those discourses that pass concerning
-themselves.  They believe it inconsistent with the happiness of departed
-souls not to be at liberty to be where they will: and do not imagine them
-capable of the ingratitude of not desiring to see those friends with whom
-they lived on earth in the strictest bonds of love and kindness: besides,
-they are persuaded that good men, after death, have these affections; and
-all other good dispositions increased rather than diminished, and
-therefore conclude that they are still among the living, and observe all
-they say or do.  From hence they engage in all their affairs with the
-greater confidence of success, as trusting to their protection; while
-this opinion of the presence of their ancestors is a restraint that
-prevents their engaging in ill designs.
-
-"They despise and laugh at auguries, and the other vain and superstitious
-ways of divination, so much observed among other nations; but have great
-reverence for such miracles as cannot flow from any of the powers of
-nature, and look on them as effects and indications of the presence of
-the Supreme Being, of which they say many instances have occurred among
-them; and that sometimes their public prayers, which upon great and
-dangerous occasions they have solemnly put up to God, with assured
-confidence of being heard, have been answered in a miraculous manner.
-
-"They think the contemplating God in His works, and the adoring Him for
-them, is a very acceptable piece of worship to Him.
-
-"There are many among them that upon a motive of religion neglect
-learning, and apply themselves to no sort of study; nor do they allow
-themselves any leisure time, but are perpetually employed, believing that
-by the good things that a man does he secures to himself that happiness
-that comes after death.  Some of these visit the sick; others mend
-highways, cleanse ditches, repair bridges, or dig turf, gravel, or stone.
-Others fell and cleave timber, and bring wood, corn, and other
-necessaries, on carts, into their towns; nor do these only serve the
-public, but they serve even private men, more than the slaves themselves
-do: for if there is anywhere a rough, hard, and sordid piece of work to
-be done, from which many are frightened by the labour and loathsomeness
-of it, if not the despair of accomplishing it, they cheerfully, and of
-their own accord, take that to their share; and by that means, as they
-ease others very much, so they afflict themselves, and spend their whole
-life in hard labour: and yet they do not value themselves upon this, nor
-lessen other people's credit to raise their own; but by their stooping to
-such servile employments they are so far from being despised, that they
-are so much the more esteemed by the whole nation.
-
-"Of these there are two sorts: some live unmarried and chaste, and
-abstain from eating any sort of flesh; and thus weaning themselves from
-all the pleasures of the present life, which they account hurtful, they
-pursue, even by the hardest and painfullest methods possible, that
-blessedness which they hope for hereafter; and the nearer they approach
-to it, they are the more cheerful and earnest in their endeavours after
-it.  Another sort of them is less willing to put themselves to much toil,
-and therefore prefer a married state to a single one; and as they do not
-deny themselves the pleasure of it, so they think the begetting of
-children is a debt which they owe to human nature, and to their country;
-nor do they avoid any pleasure that does not hinder labour; and therefore
-eat flesh so much the more willingly, as they find that by this means
-they are the more able to work: the Utopians look upon these as the wiser
-sect, but they esteem the others as the most holy.  They would indeed
-laugh at any man who, from the principles of reason, would prefer an
-unmarried state to a married, or a life of labour to an easy life: but
-they reverence and admire such as do it from the motives of religion.
-There is nothing in which they are more cautious than in giving their
-opinion positively concerning any sort of religion.  The men that lead
-those severe lives are called in the language of their country
-Brutheskas, which answers to those we call Religious Orders.
-
-"Their priests are men of eminent piety, and therefore they are but few,
-for there are only thirteen in every town, one for every temple; but when
-they go to war, seven of these go out with their forces, and seven others
-are chosen to supply their room in their absence; but these enter again
-upon their employments when they return; and those who served in their
-absence, attend upon the high priest, till vacancies fall by death; for
-there is one set over the rest.  They are chosen by the people as the
-other magistrates are, by suffrages given in secret, for preventing of
-factions: and when they are chosen, they are consecrated by the college
-of priests.  The care of all sacred things, the worship of God, and an
-inspection into the manners of the people, are committed to them.  It is
-a reproach to a man to be sent for by any of them, or for them to speak
-to him in secret, for that always gives some suspicion: all that is
-incumbent on them is only to exhort and admonish the people; for the
-power of correcting and punishing ill men belongs wholly to the Prince,
-and to the other magistrates: the severest thing that the priest does is
-the excluding those that are desperately wicked from joining in their
-worship: there is not any sort of punishment more dreaded by them than
-this, for as it loads them with infamy, so it fills them with secret
-horrors, such is their reverence to their religion; nor will their bodies
-be long exempted from their share of trouble; for if they do not very
-quickly satisfy the priests of the truth of their repentance, they are
-seized on by the Senate, and punished for their impiety.  The education
-of youth belongs to the priests, yet they do not take so much care of
-instructing them in letters, as in forming their minds and manners
-aright; they use all possible methods to infuse, very early, into the
-tender and flexible minds of children, such opinions as are both good in
-themselves and will be useful to their country, for when deep impressions
-of these things are made at that age, they follow men through the whole
-course of their lives, and conduce much to preserve the peace of the
-government, which suffers by nothing more than by vices that rise out of
-ill opinions.  The wives of their priests are the most extraordinary
-women of the whole country; sometimes the women themselves are made
-priests, though that falls out but seldom, nor are any but ancient widows
-chosen into that order.
-
-"None of the magistrates have greater honour paid them than is paid the
-priests; and if they should happen to commit any crime, they would not be
-questioned for it; their punishment is left to God, and to their own
-consciences; for they do not think it lawful to lay hands on any man, how
-wicked soever he is, that has been in a peculiar manner dedicated to God;
-nor do they find any great inconvenience in this, both because they have
-so few priests, and because these are chosen with much caution, so that
-it must be a very unusual thing to find one who, merely out of regard to
-his virtue, and for his being esteemed a singularly good man, was raised
-up to so great a dignity, degenerate into corruption and vice; and if
-such a thing should fall out, for man is a changeable creature, yet,
-there being few priests, and these having no authority but what rises out
-of the respect that is paid them, nothing of great consequence to the
-public can proceed from the indemnity that the priests enjoy.
-
-"They have, indeed, very few of them, lest greater numbers sharing in the
-same honour might make the dignity of that order, which they esteem so
-highly, to sink in its reputation; they also think it difficult to find
-out many of such an exalted pitch of goodness as to be equal to that
-dignity, which demands the exercise of more than ordinary virtues.  Nor
-are the priests in greater veneration among them than they are among
-their neighbouring nations, as you may imagine by that which I think
-gives occasion for it.
-
-"When the Utopians engage in battle, the priests who accompany them to
-the war, apparelled in their sacred vestments, kneel down during the
-action (in a place not far from the field), and, lifting up their hands
-to heaven, pray, first for peace, and then for victory to their own side,
-and particularly that it may be gained without the effusion of much blood
-on either side; and when the victory turns to their side, they run in
-among their own men to restrain their fury; and if any of their enemies
-see them or call to them, they are preserved by that means; and such as
-can come so near them as to touch their garments have not only their
-lives, but their fortunes secured to them; it is upon this account that
-all the nations round about consider them so much, and treat them with
-such reverence, that they have been often no less able to preserve their
-own people from the fury of their enemies than to save their enemies from
-their rage; for it has sometimes fallen out, that when their armies have
-been in disorder and forced to fly, so that their enemies were running
-upon the slaughter and spoil, the priests by interposing have separated
-them from one another, and stopped the effusion of more blood; so that,
-by their mediation, a peace has been concluded on very reasonable terms;
-nor is there any nation about them so fierce, cruel, or barbarous, as not
-to look upon their persons as sacred and inviolable.
-
-"The first and the last day of the month, and of the year, is a festival;
-they measure their months by the course of the moon, and their years by
-the course of the sun: the first days are called in their language the
-Cynemernes, and the last the Trapemernes, which answers in our language,
-to the festival that begins or ends the season.
-
-"They have magnificent temples, that are not only nobly built, but
-extremely spacious, which is the more necessary as they have so few of
-them; they are a little dark within, which proceeds not from any error in
-the architecture, but is done with design; for their priests think that
-too much light dissipates the thoughts, and that a more moderate degree
-of it both recollects the mind and raises devotion.  Though there are
-many different forms of religion among them, yet all these, how various
-soever, agree in the main point, which is the worshipping the Divine
-Essence; and, therefore, there is nothing to be seen or heard in their
-temples in which the several persuasions among them may not agree; for
-every sect performs those rites that are peculiar to it in their private
-houses, nor is there anything in the public worship that contradicts the
-particular ways of those different sects.  There are no images for God in
-their temples, so that every one may represent Him to his thoughts
-according to the way of his religion; nor do they call this one God by
-any other name but that of Mithras, which is the common name by which
-they all express the Divine Essence, whatsoever otherwise they think it
-to be; nor are there any prayers among them but such as every one of them
-may use without prejudice to his own opinion.
-
-"They meet in their temples on the evening of the festival that concludes
-a season, and not having yet broke their fast, they thank God for their
-good success during that year or month which is then at an end; and the
-next day, being that which begins the new season, they meet early in
-their temples, to pray for the happy progress of all their affairs during
-that period upon which they then enter.  In the festival which concludes
-the period, before they go to the temple, both wives and children fall on
-their knees before their husbands or parents and confess everything in
-which they have either erred or failed in their duty, and beg pardon for
-it.  Thus all little discontents in families are removed, that they may
-offer up their devotions with a pure and serene mind; for they hold it a
-great impiety to enter upon them with disturbed thoughts, or with a
-consciousness of their bearing hatred or anger in their hearts to any
-person whatsoever; and think that they should become liable to severe
-punishments if they presumed to offer sacrifices without cleansing their
-hearts, and reconciling all their differences.  In the temples the two
-sexes are separated, the men go to the right hand, and the women to the
-left; and the males and females all place themselves before the head and
-master or mistress of the family to which they belong, so that those who
-have the government of them at home may see their deportment in public.
-And they intermingle them so, that the younger and the older may be set
-by one another; for if the younger sort were all set together, they
-would, perhaps, trifle away that time too much in which they ought to
-beget in themselves that religious dread of the Supreme Being which is
-the greatest and almost the only incitement to virtue.
-
-"They offer up no living creature in sacrifice, nor do they think it
-suitable to the Divine Being, from whose bounty it is that these
-creatures have derived their lives, to take pleasure in their deaths, or
-the offering up their blood.  They burn incense and other sweet odours,
-and have a great number of wax lights during their worship, not out of
-any imagination that such oblations can add anything to the divine nature
-(which even prayers cannot do), but as it is a harmless and pure way of
-worshipping God; so they think those sweet savours and lights, together
-with some other ceremonies, by a secret and unaccountable virtue, elevate
-men's souls, and inflame them with greater energy and cheerfulness during
-the divine worship.
-
-"All the people appear in the temples in white garments; but the priest's
-vestments are parti-coloured, and both the work and colours are
-wonderful.  They are made of no rich materials, for they are neither
-embroidered nor set with precious stones; but are composed of the plumes
-of several birds, laid together with so much art, and so neatly, that the
-true value of them is far beyond the costliest materials.  They say, that
-in the ordering and placing those plumes some dark mysteries are
-represented, which pass down among their priests in a secret tradition
-concerning them; and that they are as hieroglyphics, putting them in mind
-of the blessing that they have received from God, and of their duties,
-both to Him and to their neighbours.  As soon as the priest appears in
-those ornaments, they all fall prostrate on the ground, with so much
-reverence and so deep a silence, that such as look on cannot but be
-struck with it, as if it were the effect of the appearance of a deity.
-After they have been for some time in this posture, they all stand up,
-upon a sign given by the priest, and sing hymns to the honour of God,
-some musical instruments playing all the while.  These are quite of
-another form than those used among us; but, as many of them are much
-sweeter than ours, so others are made use of by us.  Yet in one thing
-they very much exceed us: all their music, both vocal and instrumental,
-is adapted to imitate and express the passions, and is so happily suited
-to every occasion, that, whether the subject of the hymn be cheerful, or
-formed to soothe or trouble the mind, or to express grief or remorse, the
-music takes the impression of whatever is represented, affects and
-kindles the passions, and works the sentiments deep into the hearts of
-the hearers.  When this is done, both priests and people offer up very
-solemn prayers to God in a set form of words; and these are so composed,
-that whatsoever is pronounced by the whole assembly may be likewise
-applied by every man in particular to his own condition.  In these they
-acknowledge God to be the author and governor of the world, and the
-fountain of all the good they receive, and therefore offer up to him
-their thanksgiving; and, in particular, bless him for His goodness in
-ordering it so, that they are born under the happiest government in the
-world, and are of a religion which they hope is the truest of all others;
-but, if they are mistaken, and if there is either a better government, or
-a religion more acceptable to God, they implore His goodness to let them
-know it, vowing that they resolve to follow him whithersoever he leads
-them; but if their government is the best, and their religion the truest,
-then they pray that He may fortify them in it, and bring all the world
-both to the same rules of life, and to the same opinions concerning
-Himself, unless, according to the unsearchableness of His mind, He is
-pleased with a variety of religions.  Then they pray that God may give
-them an easy passage at last to Himself, not presuming to set limits to
-Him, how early or late it should be; but, if it may be wished for without
-derogating from His supreme authority, they desire to be quickly
-delivered, and to be taken to Himself, though by the most terrible kind
-of death, rather than to be detained long from seeing Him by the most
-prosperous course of life.  When this prayer is ended, they all fall down
-again upon the ground; and, after a little while, they rise up, go home
-to dinner, and spend the rest of the day in diversion or military
-exercises.
-
-"Thus have I described to you, as particularly as I could, the
-Constitution of that commonwealth, which I do not only think the best in
-the world, but indeed the only commonwealth that truly deserves that
-name.  In all other places it is visible that, while people talk of a
-commonwealth, every man only seeks his own wealth; but there, where no
-man has any property, all men zealously pursue the good of the public,
-and, indeed, it is no wonder to see men act so differently, for in other
-commonwealths every man knows that, unless he provides for himself, how
-flourishing soever the commonwealth may be, he must die of hunger, so
-that he sees the necessity of preferring his own concerns to the public;
-but in Utopia, where every man has a right to everything, they all know
-that if care is taken to keep the public stores full no private man can
-want anything; for among them there is no unequal distribution, so that
-no man is poor, none in necessity, and though no man has anything, yet
-they are all rich; for what can make a man so rich as to lead a serene
-and cheerful life, free from anxieties; neither apprehending want
-himself, nor vexed with the endless complaints of his wife?  He is not
-afraid of the misery of his children, nor is he contriving how to raise a
-portion for his daughters; but is secure in this, that both he and his
-wife, his children and grand-children, to as many generations as he can
-fancy, will all live both plentifully and happily; since, among them,
-there is no less care taken of those who were once engaged in labour, but
-grow afterwards unable to follow it, than there is, elsewhere, of these
-that continue still employed.  I would gladly hear any man compare the
-justice that is among them with that of all other nations; among whom,
-may I perish, if I see anything that looks either like justice or equity;
-for what justice is there in this: that a nobleman, a goldsmith, a
-banker, or any other man, that either does nothing at all, or, at best,
-is employed in things that are of no use to the public, should live in
-great luxury and splendour upon what is so ill acquired, and a mean man,
-a carter, a smith, or a ploughman, that works harder even than the beasts
-themselves, and is employed in labours so necessary, that no commonwealth
-could hold out a year without them, can only earn so poor a livelihood
-and must lead so miserable a life, that the condition of the beasts is
-much better than theirs?  For as the beasts do not work so constantly, so
-they feed almost as well, and with more pleasure, and have no anxiety
-about what is to come, whilst these men are depressed by a barren and
-fruitless employment, and tormented with the apprehensions of want in
-their old age; since that which they get by their daily labour does but
-maintain them at present, and is consumed as fast as it comes in, there
-is no overplus left to lay up for old age.
-
-"Is not that government both unjust and ungrateful, that is so prodigal
-of its favours to those that are called gentlemen, or goldsmiths, or such
-others who are idle, or live either by flattery or by contriving the arts
-of vain pleasure, and, on the other hand, takes no care of those of a
-meaner sort, such as ploughmen, colliers, and smiths, without whom it
-could not subsist?  But after the public has reaped all the advantage of
-their service, and they come to be oppressed with age, sickness, and
-want, all their labours and the good they have done is forgotten, and all
-the recompense given them is that they are left to die in great misery.
-The richer sort are often endeavouring to bring the hire of labourers
-lower, not only by their fraudulent practices, but by the laws which they
-procure to be made to that effect, so that though it is a thing most
-unjust in itself to give such small rewards to those who deserve so well
-of the public, yet they have given those hardships the name and colour of
-justice, by procuring laws to be made for regulating them.
-
-"Therefore I must say that, as I hope for mercy, I can have no other
-notion of all the other governments that I see or know, than that they
-are a conspiracy of the rich, who, on pretence of managing the public,
-only pursue their private ends, and devise all the ways and arts they can
-find out; first, that they may, without danger, preserve all that they
-have so ill-acquired, and then, that they may engage the poor to toil and
-labour for them at as low rates as possible, and oppress them as much as
-they please; and if they can but prevail to get these contrivances
-established by the show of public authority, which is considered as the
-representative of the whole people, then they are accounted laws; yet
-these wicked men, after they have, by a most insatiable covetousness,
-divided that among themselves with which all the rest might have been
-well supplied, are far from that happiness that is enjoyed among the
-Utopians; for the use as well as the desire of money being extinguished,
-much anxiety and great occasions of mischief is cut off with it, and who
-does not see that the frauds, thefts, robberies, quarrels, tumults,
-contentions, seditions, murders, treacheries, and witchcrafts, which are,
-indeed, rather punished than restrained by the seventies of law, would
-all fall off, if money were not any more valued by the world?  Men's
-fears, solicitudes, cares, labours, and watchings would all perish in the
-same moment with the value of money; even poverty itself, for the relief
-of which money seems most necessary, would fall.  But, in order to the
-apprehending this aright, take one instance:--
-
-"Consider any year, that has been so unfruitful that many thousands have
-died of hunger; and yet if, at the end of that year, a survey was made of
-the granaries of all the rich men that have hoarded up the corn, it would
-be found that there was enough among them to have prevented all that
-consumption of men that perished in misery; and that, if it had been
-distributed among them, none would have felt the terrible effects of that
-scarcity: so easy a thing would it be to supply all the necessities of
-life, if that blessed thing called money, which is pretended to be
-invented for procuring them was not really the only thing that obstructed
-their being procured!
-
-"I do not doubt but rich men are sensible of this, and that they well
-know how much a greater happiness it is to want nothing necessary, than
-to abound in many superfluities; and to be rescued out of so much misery,
-than to abound with so much wealth: and I cannot think but the sense of
-every man's interest, added to the authority of Christ's commands, who,
-as He was infinitely wise, knew what was best, and was not less good in
-discovering it to us, would have drawn all the world over to the laws of
-the Utopians, if pride, that plague of human nature, that source of so
-much misery, did not hinder it; for this vice does not measure happiness
-so much by its own conveniences, as by the miseries of others; and would
-not be satisfied with being thought a goddess, if none were left that
-were miserable, over whom she might insult.  Pride thinks its own
-happiness shines the brighter, by comparing it with the misfortunes of
-other persons; that by displaying its own wealth they may feel their
-poverty the more sensibly.  This is that infernal serpent that creeps
-into the breasts of mortals, and possesses them too much to be easily
-drawn out; and, therefore, I am glad that the Utopians have fallen upon
-this form of government, in which I wish that all the world could be so
-wise as to imitate them; for they have, indeed, laid down such a scheme
-and foundation of policy, that as men live happily under it, so it is
-like to be of great continuance; for they having rooted out of the minds
-of their people all the seeds, both of ambition and faction, there is no
-danger of any commotions at home; which alone has been the ruin of many
-states that seemed otherwise to be well secured; but as long as they live
-in peace at home, and are governed by such good laws, the envy of all
-their neighbouring princes, who have often, though in vain, attempted
-their ruin, will never be able to put their state into any commotion or
-disorder."
-
-When Raphael had thus made an end of speaking, though many things
-occurred to me, both concerning the manners and laws of that people, that
-seemed very absurd, as well in their way of making war, as in their
-notions of religion and divine matters--together with several other
-particulars, but chiefly what seemed the foundation of all the rest,
-their living in common, without the use of money, by which all nobility,
-magnificence, splendour, and majesty, which, according to the common
-opinion, are the true ornaments of a nation, would be quite taken
-away--yet since I perceived that Raphael was weary, and was not sure
-whether he could easily bear contradiction, remembering that he had taken
-notice of some, who seemed to think they were bound in honour to support
-the credit of their own wisdom, by finding out something to censure in
-all other men's inventions, besides their own, I only commended their
-Constitution, and the account he had given of it in general; and so,
-taking him by the hand, carried him to supper, and told him I would find
-out some other time for examining this subject more particularly, and for
-discoursing more copiously upon it.  And, indeed, I shall be glad to
-embrace an opportunity of doing it.  In the meanwhile, though it must be
-confessed that he is both a very learned man and a person who has
-obtained a great knowledge of the world, I cannot perfectly agree to
-everything he has related.  However, there are many things in the
-commonwealth of Utopia that I rather wish, than hope, to see followed in
-our governments.
-
-
-
-***END OF THE PROJECT GUTENBERG EBOOK UTOPIA***
-
-
-******* This file should be named 2130.txt or 2130.zip *******
-
-
-This and all associated files of various formats will be found in:
-http://www.gutenberg.org/dirs/2/1/3/2130
-
-
-
-Updated editions will replace the previous one--the old editions
-will be renamed.
-
-Creating the works from public domain print editions means that no
-one owns a United States copyright in these works, so the Foundation
-(and you!) can copy and distribute it in the United States without
-permission and without paying copyright royalties.  Special rules,
-set forth in the General Terms of Use part of this license, apply to
-copying and distributing Project Gutenberg-tm electronic works to
-protect the PROJECT GUTENBERG-tm concept and trademark.  Project
-Gutenberg is a registered trademark, and may not be used if you
-charge for the eBooks, unless you receive specific permission.  If you
-do not charge anything for copies of this eBook, complying with the
-rules is very easy.  You may use this eBook for nearly any purpose
-such as creation of derivative works, reports, performances and
-research.  They may be modified and printed and given away--you may do
-practically ANYTHING with public domain eBooks.  Redistribution is
-subject to the trademark license, especially commercial
-redistribution.
-
-
-
-*** START: FULL LICENSE ***
-
-THE FULL PROJECT GUTENBERG LICENSE
-PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK
-
-To protect the Project Gutenberg-tm mission of promoting the free
-distribution of electronic works, by using or distributing this work
-(or any other work associated in any way with the phrase "Project
-Gutenberg"), you agree to comply with all the terms of the Full Project
-Gutenberg-tm License (available with this file or online at
-http://gutenberg.net/license).
-
-
-Section 1.  General Terms of Use and Redistributing Project Gutenberg-tm
-electronic works
-
-1.A.  By reading or using any part of this Project Gutenberg-tm
-electronic work, you indicate that you have read, understand, agree to
-and accept all the terms of this license and intellectual property
-(trademark/copyright) agreement.  If you do not agree to abide by all
-the terms of this agreement, you must cease using and return or destroy
-all copies of Project Gutenberg-tm electronic works in your possession.
-If you paid a fee for obtaining a copy of or access to a Project
-Gutenberg-tm electronic work and you do not agree to be bound by the
-terms of this agreement, you may obtain a refund from the person or
-entity to whom you paid the fee as set forth in paragraph 1.E.8.
-
-1.B.  "Project Gutenberg" is a registered trademark.  It may only be
-used on or associated in any way with an electronic work by people who
-agree to be bound by the terms of this agreement.  There are a few
-things that you can do with most Project Gutenberg-tm electronic works
-even without complying with the full terms of this agreement.  See
-paragraph 1.C below.  There are a lot of things you can do with Project
-Gutenberg-tm electronic works if you follow the terms of this agreement
-and help preserve free future access to Project Gutenberg-tm electronic
-works.  See paragraph 1.E below.
-
-1.C.  The Project Gutenberg Literary Archive Foundation ("the Foundation"
-or PGLAF), owns a compilation copyright in the collection of Project
-Gutenberg-tm electronic works.  Nearly all the individual works in the
-collection are in the public domain in the United States.  If an
-individual work is in the public domain in the United States and you are
-located in the United States, we do not claim a right to prevent you from
-copying, distributing, performing, displaying or creating derivative
-works based on the work as long as all references to Project Gutenberg
-are removed.  Of course, we hope that you will support the Project
-Gutenberg-tm mission of promoting free access to electronic works by
-freely sharing Project Gutenberg-tm works in compliance with the terms of
-this agreement for keeping the Project Gutenberg-tm name associated with
-the work.  You can easily comply with the terms of this agreement by
-keeping this work in the same format with its attached full Project
-Gutenberg-tm License when you share it without charge with others.
-
-1.D.  The copyright laws of the place where you are located also govern
-what you can do with this work.  Copyright laws in most countries are in
-a constant state of change.  If you are outside the United States, check
-the laws of your country in addition to the terms of this agreement
-before downloading, copying, displaying, performing, distributing or
-creating derivative works based on this work or any other Project
-Gutenberg-tm work.  The Foundation makes no representations concerning
-the copyright status of any work in any country outside the United
-States.
-
-1.E.  Unless you have removed all references to Project Gutenberg:
-
-1.E.1.  The following sentence, with active links to, or other immediate
-access to, the full Project Gutenberg-tm License must appear prominently
-whenever any copy of a Project Gutenberg-tm work (any work on which the
-phrase "Project Gutenberg" appears, or with which the phrase "Project
-Gutenberg" is associated) is accessed, displayed, performed, viewed,
-copied or distributed:
-
-This eBook is for the use of anyone anywhere at no cost and with
-almost no restrictions whatsoever.  You may copy it, give it away or
-re-use it under the terms of the Project Gutenberg License included
-with this eBook or online at www.gutenberg.net
-
-1.E.2.  If an individual Project Gutenberg-tm electronic work is derived
-from the public domain (does not contain a notice indicating that it is
-posted with permission of the copyright holder), the work can be copied
-and distributed to anyone in the United States without paying any fees
-or charges.  If you are redistributing or providing access to a work
-with the phrase "Project Gutenberg" associated with or appearing on the
-work, you must comply either with the requirements of paragraphs 1.E.1
-through 1.E.7 or obtain permission for the use of the work and the
-Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or
-1.E.9.
-
-1.E.3.  If an individual Project Gutenberg-tm electronic work is posted
-with the permission of the copyright holder, your use and distribution
-must comply with both paragraphs 1.E.1 through 1.E.7 and any additional
-terms imposed by the copyright holder.  Additional terms will be linked
-to the Project Gutenberg-tm License for all works posted with the
-permission of the copyright holder found at the beginning of this work.
-
-1.E.4.  Do not unlink or detach or remove the full Project Gutenberg-tm
-License terms from this work, or any files containing a part of this
-work or any other work associated with Project Gutenberg-tm.
-
-1.E.5.  Do not copy, display, perform, distribute or redistribute this
-electronic work, or any part of this electronic work, without
-prominently displaying the sentence set forth in paragraph 1.E.1 with
-active links or immediate access to the full terms of the Project
-Gutenberg-tm License.
-
-1.E.6.  You may convert to and distribute this work in any binary,
-compressed, marked up, nonproprietary or proprietary form, including any
-word processing or hypertext form.  However, if you provide access to or
-distribute copies of a Project Gutenberg-tm work in a format other than
-"Plain Vanilla ASCII" or other format used in the official version
-posted on the official Project Gutenberg-tm web site (www.gutenberg.net),
-you must, at no additional cost, fee or expense to the user, provide a
-copy, a means of exporting a copy, or a means of obtaining a copy upon
-request, of the work in its original "Plain Vanilla ASCII" or other
-form.  Any alternate format must include the full Project Gutenberg-tm
-License as specified in paragraph 1.E.1.
-
-1.E.7.  Do not charge a fee for access to, viewing, displaying,
-performing, copying or distributing any Project Gutenberg-tm works
-unless you comply with paragraph 1.E.8 or 1.E.9.
-
-1.E.8.  You may charge a reasonable fee for copies of or providing
-access to or distributing Project Gutenberg-tm electronic works provided
-that
-
-- You pay a royalty fee of 20% of the gross profits you derive from
-     the use of Project Gutenberg-tm works calculated using the method
-     you already use to calculate your applicable taxes.  The fee is
-     owed to the owner of the Project Gutenberg-tm trademark, but he
-     has agreed to donate royalties under this paragraph to the
-     Project Gutenberg Literary Archive Foundation.  Royalty payments
-     must be paid within 60 days following each date on which you
-     prepare (or are legally required to prepare) your periodic tax
-     returns.  Royalty payments should be clearly marked as such and
-     sent to the Project Gutenberg Literary Archive Foundation at the
-     address specified in Section 4, "Information about donations to
-     the Project Gutenberg Literary Archive Foundation."
-
-- You provide a full refund of any money paid by a user who notifies
-     you in writing (or by e-mail) within 30 days of receipt that s/he
-     does not agree to the terms of the full Project Gutenberg-tm
-     License.  You must require such a user to return or
-     destroy all copies of the works possessed in a physical medium
-     and discontinue all use of and all access to other copies of
-     Project Gutenberg-tm works.
-
-- You provide, in accordance with paragraph 1.F.3, a full refund of any
-     money paid for a work or a replacement copy, if a defect in the
-     electronic work is discovered and reported to you within 90 days
-     of receipt of the work.
-
-- You comply with all other terms of this agreement for free
-     distribution of Project Gutenberg-tm works.
-
-1.E.9.  If you wish to charge a fee or distribute a Project Gutenberg-tm
-electronic work or group of works on different terms than are set
-forth in this agreement, you must obtain permission in writing from
-both the Project Gutenberg Literary Archive Foundation and Michael
-Hart, the owner of the Project Gutenberg-tm trademark.  Contact the
-Foundation as set forth in Section 3 below.
-
-1.F.
-
-1.F.1.  Project Gutenberg volunteers and employees expend considerable
-effort to identify, do copyright research on, transcribe and proofread
-public domain works in creating the Project Gutenberg-tm
-collection.  Despite these efforts, Project Gutenberg-tm electronic
-works, and the medium on which they may be stored, may contain
-"Defects," such as, but not limited to, incomplete, inaccurate or
-corrupt data, transcription errors, a copyright or other intellectual
-property infringement, a defective or damaged disk or other medium, a
-computer virus, or computer codes that damage or cannot be read by
-your equipment.
-
-1.F.2.  LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right
-of Replacement or Refund" described in paragraph 1.F.3, the Project
-Gutenberg Literary Archive Foundation, the owner of the Project
-Gutenberg-tm trademark, and any other party distributing a Project
-Gutenberg-tm electronic work under this agreement, disclaim all
-liability to you for damages, costs and expenses, including legal
-fees.  YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
-LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE
-PROVIDED IN PARAGRAPH F3.  YOU AGREE THAT THE FOUNDATION, THE
-TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE
-LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR
-INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-1.F.3.  LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a
-defect in this electronic work within 90 days of receiving it, you can
-receive a refund of the money (if any) you paid for it by sending a
-written explanation to the person you received the work from.  If you
-received the work on a physical medium, you must return the medium with
-your written explanation.  The person or entity that provided you with
-the defective work may elect to provide a replacement copy in lieu of a
-refund.  If you received the work electronically, the person or entity
-providing it to you may choose to give you a second opportunity to
-receive the work electronically in lieu of a refund.  If the second copy
-is also defective, you may demand a refund in writing without further
-opportunities to fix the problem.
-
-1.F.4.  Except for the limited right of replacement or refund set forth
-in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO OTHER
-WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.
-
-1.F.5.  Some states do not allow disclaimers of certain implied
-warranties or the exclusion or limitation of certain types of damages.
-If any disclaimer or limitation set forth in this agreement violates the
-law of the state applicable to this agreement, the agreement shall be
-interpreted to make the maximum disclaimer or limitation permitted by
-the applicable state law.  The invalidity or unenforceability of any
-provision of this agreement shall not void the remaining provisions.
-
-1.F.6.  INDEMNITY - You agree to indemnify and hold the Foundation, the
-trademark owner, any agent or employee of the Foundation, anyone
-providing copies of Project Gutenberg-tm electronic works in accordance
-with this agreement, and any volunteers associated with the production,
-promotion and distribution of Project Gutenberg-tm electronic works,
-harmless from all liability, costs and expenses, including legal fees,
-that arise directly or indirectly from any of the following which you do
-or cause to occur: (a) distribution of this or any Project Gutenberg-tm
-work, (b) alteration, modification, or additions or deletions to any
-Project Gutenberg-tm work, and (c) any Defect you cause.
-
-
-Section  2.  Information about the Mission of Project Gutenberg-tm
-
-Project Gutenberg-tm is synonymous with the free distribution of
-electronic works in formats readable by the widest variety of computers
-including obsolete, old, middle-aged and new computers.  It exists
-because of the efforts of hundreds of volunteers and donations from
-people in all walks of life.
-
-Volunteers and financial support to provide volunteers with the
-assistance they need, is critical to reaching Project Gutenberg-tm's
-goals and ensuring that the Project Gutenberg-tm collection will
-remain freely available for generations to come.  In 2001, the Project
-Gutenberg Literary Archive Foundation was created to provide a secure
-and permanent future for Project Gutenberg-tm and future generations.
-To learn more about the Project Gutenberg Literary Archive Foundation
-and how your efforts and donations can help, see Sections 3 and 4
-and the Foundation web page at http://www.gutenberg.net/fundraising/pglaf.
-
-
-Section 3.  Information about the Project Gutenberg Literary Archive
-Foundation
-
-The Project Gutenberg Literary Archive Foundation is a non profit
-501(c)(3) educational corporation organized under the laws of the
-state of Mississippi and granted tax exempt status by the Internal
-Revenue Service.  The Foundation's EIN or federal tax identification
-number is 64-6221541.  Contributions to the Project Gutenberg
-Literary Archive Foundation are tax deductible to the full extent
-permitted by U.S. federal laws and your state's laws.
-
-The Foundation's principal office is located at 4557 Melan Dr. S.
-Fairbanks, AK, 99712., but its volunteers and employees are scattered
-throughout numerous locations.  Its business office is located at
-809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email
-business@pglaf.org.  Email contact links and up to date contact
-information can be found at the Foundation's web site and official
-page at http://www.gutenberg.net/about/contact
-
-For additional contact information:
-     Dr. Gregory B. Newby
-     Chief Executive and Director
-     gbnewby@pglaf.org
-
-Section 4.  Information about Donations to the Project Gutenberg
-Literary Archive Foundation
-
-Project Gutenberg-tm depends upon and cannot survive without wide
-spread public support and donations to carry out its mission of
-increasing the number of public domain and licensed works that can be
-freely distributed in machine readable form accessible by the widest
-array of equipment including outdated equipment.  Many small donations
-($1 to $5,000) are particularly important to maintaining tax exempt
-status with the IRS.
-
-The Foundation is committed to complying with the laws regulating
-charities and charitable donations in all 50 states of the United
-States.  Compliance requirements are not uniform and it takes a
-considerable effort, much paperwork and many fees to meet and keep up
-with these requirements.  We do not solicit donations in locations
-where we have not received written confirmation of compliance.  To
-SEND DONATIONS or determine the status of compliance for any
-particular state visit http://www.gutenberg.net/fundraising/donate
-
-While we cannot and do not solicit contributions from states where we
-have not met the solicitation requirements, we know of no prohibition
-against accepting unsolicited donations from donors in such states who
-approach us with offers to donate.
-
-International donations are gratefully accepted, but we cannot make
-any statements concerning tax treatment of donations received from
-outside the United States.  U.S. laws alone swamp our small staff.
-
-Please check the Project Gutenberg Web pages for current donation
-methods and addresses.  Donations are accepted in a number of other
-ways including including checks, online payments and credit card
-donations.  To donate, please visit:
-http://www.gutenberg.net/fundraising/donate
-
-
-Section 5.  General Information About Project Gutenberg-tm electronic
-works.
-
-Professor Michael S. Hart is the originator of the Project Gutenberg-tm
-concept of a library of electronic works that could be freely shared
-with anyone.  For thirty years, he produced and distributed Project
-Gutenberg-tm eBooks with only a loose network of volunteer support.
-
-Project Gutenberg-tm eBooks are often created from several printed
-editions, all of which are confirmed as Public Domain in the U.S.
-unless a copyright notice is included.  Thus, we do not necessarily
-keep eBooks in compliance with any particular paper edition.
-
-Most people start at our Web site which has the main PG search facility:
-
-     http://www.gutenberg.net
-
-This Web site includes information about Project Gutenberg-tm,
-including how to make donations to the Project Gutenberg Literary
-Archive Foundation, how to help produce our new eBooks, and how to
-subscribe to our email newsletter to hear about new eBooks.
− tests/Examples/ConcatMap.hs
@@ -1,8 +0,0 @@-module M where-import Char--import Data.List.Stream as L--foo :: [Char] -> [Char]-foo xs = (L.concatMap (L.replicate 10000)) ( map toUpper xs)-
− tests/Examples/Enum.hs
@@ -1,9 +0,0 @@--import Data.List.Stream-import Prelude hiding (map,sum,head)-import System.Environment--main = do-    n <- getArgs >>= readIO . head-    print (sum (map (+1) [1..(n::Int)])) -- 1 fusion site.-    print (sum (map (+1) [1..(10::Int)])) -- 2 fusion site.
− tests/Examples/Sum.hs
@@ -1,4 +0,0 @@-import Data.List--main = print . sum . map read . lines =<< getContents-
− tests/Examples/SumReplicate.hs
@@ -1,6 +0,0 @@-module FuseTest where--import Data.List as L--foo :: Int -> Int-foo n = L.sum (L.replicate n 1)
− tests/FuseTest.hs
@@ -1,6 +0,0 @@-module FuseTest where--import Data.List.Stream as L--foo :: Int -> Int-foo n = L.sum (L.replicate n 1)
− tests/Makefile
@@ -1,90 +0,0 @@--GHC_FLAGS=-cpp -DEXTERNAL_PACKAGE -i.. -O2 -fglasgow-exts -fbang-patterns -package QuickCheck-1.2.0.1 -#GHC_FLAGS="-hide-package arrows-0.2"-GHC=ghc--# run everything!-all :: internal list stream strictness list-compiled stream-compiled internal-compiled strictness-compiled--# ----------------------------------------------------------------# testing--list ::-	runhaskell  $(GHC_FLAGS) Properties/ListVsSpec.hs-	runhaskell  $(GHC_FLAGS) Properties/ListVsBase.hs-stream ::-	runhaskell  $(GHC_FLAGS) Properties/StreamListVsSpec.hs-	runhaskell  $(GHC_FLAGS) Properties/StreamListVsBase.hs-	runhaskell  $(GHC_FLAGS) Properties/StreamVsSpecStream.hs-internal ::-	runhaskell  $(GHC_FLAGS) Properties/Internal.hs-strictness ::-	runhaskell  $(GHC_FLAGS) Strictness/ListVsSpec.hs-	runhaskell  $(GHC_FLAGS) Strictness/ListVsBase.hs-	runhaskell  $(GHC_FLAGS) Strictness/BaseVsSpec.hs-	runhaskell  $(GHC_FLAGS) Strictness/StreamListVsList.hs--list-compiled ::-	ghc  $(GHC_FLAGS) --make -frules-off -o lp Properties/ListVsSpec.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o lp2 Properties/ListVsBase.hs-	time ./lp-	time ./lp2-stream-compiled ::-	ghc  $(GHC_FLAGS) --make -frules-off -o sp Properties/StreamListVsSpec.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o sp2 Properties/StreamListVsBase.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o sp3 Properties/StreamVsSpecStream.hs-	time ./sp-	time ./sp2-	time ./sp3-internal-compiled ::-	ghc  $(GHC_FLAGS) --make -frules-off -o ip Properties/Internal.hs-	time ./ip-strictness-compiled ::-	ghc  $(GHC_FLAGS) --make -frules-off -o strp Strictness/ListVsSpec.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o strp2 Strictness/ListVsBase.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o strp3 Strictness/BaseVsSpec.hs-	ghc  $(GHC_FLAGS) --make -frules-off -o strp4 Strictness/StreamListVsList.hs-	time ./strp-	time ./strp2-	time ./strp3-	time ./strp4--# ----------------------------------------------------------------# benchmarking--bench ::-	$(GHC) $(GHC_FLAGS) --make Bench/ListVsBase.hs -o bench-	$(GHC) $(GHC_FLAGS) --make Bench/StreamVsList.hs -o bench2-	./bench-	./bench2--fusetest :: compiled-	$(GHC) $(GHC_FLAGS) -c -no-recomp -ddump-simpl-stats \-		 FuseTest.hs--compiled :: ../Data/Stream.hs ../Data/List/Stream.hs \-	Bench/Utils.hs Properties/Utils.hs Strictness/Utils.hs \-	Spec/List.hs Spec/ListExts.hs Spec/PreludeList.hs \-	Properties/Monomorphic/Base.hs \-	Properties/Monomorphic/List.hs \-	Properties/Monomorphic/Spec.hs \-	Properties/Monomorphic/SpecStream.hs \-	Properties/Monomorphic/Stream.hs \-	Properties/Monomorphic/StreamList.hs \-	Strictness/Monomorphic/Base.hs \-	Strictness/Monomorphic/List.hs \-	Strictness/Monomorphic/Spec.hs \-	Strictness/Monomorphic/StreamList.hs-	$(GHC) $(GHC_FLAGS) --make $^--Bench/bigdata :-	cat Bench/data Bench/data Bench/data Bench/data Bench/data > Bench/bigdata--# ----------------------------------------------------------------# cleaning--clean :-	rm -f *.hi *.o ../Data/*.o ../Data/*.hi ../Data/List/*.o ../Data/List/*.hi-	rm -f Spec/*.o Spec/*.hi Bench/*.o Bench/*.hi-	rm -f Properties/*.o Properties/*.hi Strictness/*.o Strictness/*.hi-	rm -f bench bench2 lp lp2 sp sp2 sp3 ip strp strp2 strp3
− tests/Properties/Internal.hs
@@ -1,358 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Test the new list implementation for internal properties----import Prelude (($),(.),(&&),(||),(+),Int,(==),Bool(..),not,flip,uncurry)--import Properties.Utils-import System.IO--import Data.Maybe-import qualified Data.List.Stream as T----------------------------------------------------------------------------- * Basic interface---- map fusion-prop_mapmap = (\(f  :: B -> C)-                (g  :: A -> B)-                (xs) -> T.map f . T.map g $ xs) `eq3`--                 (\f g xs -> T.map (f.g)       $ xs)--prop_maprepeat n = (\(f :: A -> B)-                   (x :: A) -> T.map f (T.take n $ T.repeat x)) `eq2` (\f x -> T.take n $ T.repeat (f x))--prop_mapreplicate n = (\(f :: A -> B)-                   (x :: A) -> T.map f (T.replicate n x)) `eq2` (\f x -> T.replicate n (f x))----------------------------------------------------------------------------- * List transformations--prop_reverse = T.foldl (flip (:)) [] `eq1` (\(x :: [A]) -> T.reverse  x)----------------------------------------------------------------------------- * Reducing lists (folds)----------------------------------------------------------------------------- ** Special folds--prop_concatfoldr = (\(xs :: [[A]]) -> T.concat xs) `eq1` (T.foldr (T.++) [])--prop_concatmap = (\(f :: A -> [B]) (xs :: [A]) -> T.concatMap f xs) `eq2` -                                            (\f -> T.concat . T.map f)--prop_and       = (T.foldr (&&) True) `eq1` T.and-prop_or        = (T.foldr (||) False) `eq1` T.or-prop_sum       = (T.foldl (+) 0)     `eq1`  (T.sum :: [Int] -> Int)----------------------------------------------------------------------------- * Building lists--- ** Scans---- (a -> b -> a) -> a -> [b] -> [a]-prop_scanlfold = (\(f :: A -> B -> A)-                   (z :: A)-                   (xs::[B]) ->-                        T.last (T.scanl f z xs)) `eq3`-                 (\f z xs ->-                        T.foldl f z xs)---- (a -> b -> a) -> a -> [b] -> [a]-prop_scanrfold = (\(f :: A -> B -> B)-                   (z :: B)-                   (xs::[A]) ->-                        T.head (T.scanr f z xs)) `eq3`-                 (\f z xs ->-                        T.foldr f z xs)----------------------------------------------------------------------------- ** Accumulating maps----------------------------------------------------------------------------- ** Infinite lists--prop_replicate = T.replicate `eq2` (\n (x :: A) -> T.take n (T.repeat x))----------------------------------------------------------------------------- ** Unfolding----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_break_span = T.break `eq2` (\(p :: A -> Bool) -> T.span (not . p))----------------------------------------------------------------------------- * Predicates--{------- not true, has to take the minimum of the two, not the first only.----prop_isPrefixOfzip = (\(xs:: [A]) ys ->-                               (T.isPrefixOf xs ys)) `eq2`-                     (\xs ys ->-                               (T.all (uncurry (==)) (T.zip xs ys)))--}----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality----------------------------------------------------------------------------- ** Searching with a predicate--prop_filterfilter = (\(p :: A -> Bool)-                      (q :: A -> Bool)-                      (s :: [A] ) ->-                             T.filter p (T.filter q s))         `eq3`-                    (\p q s ->-                             T.filter (\x -> q x && p x) s)----------------------------------------------------------------------------- * Indexing lists--prop_findIndexfilter = (\p (xs ::[A]) ->-                             T.findIndex p xs) `eq2`-                       (\p xs         ->-                             listToMaybe [ n | (n,x) <- T.zip [0..] xs, p x ])--prop_elemIndexfilter = (\x (xs ::[A]) ->-                             T.elemIndex x xs) `eq2`-                       (\x xs         ->-                             listToMaybe [ n | (n,a) <- T.zip [0..] xs, a==x ])--prop_elemfindIndex   = (\x (xs ::[A]) ->-                             T.findIndex (==x) xs) `eq2`-                       (\x xs         ->-                             T.elemIndex x     xs)--prop_filterelemIndices = (\a (xs :: [A]) ->-                             T.length (T.filter (==a) xs)) `eq2`-                         (\a xs ->-                             T.length (T.elemIndices a xs))--prop_filterfindIndices = (\p (xs :: [A]) ->-                             T.length (T.filter p xs)) `eq2`-                         (\p xs ->-                             T.length (T.findIndices p xs))----------------------------------------------------------------------------- * Zipping and unzipping lists------------------------------------------------------------------------------------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_unlinesconcat    = T.unlines `eqnotnull1` (\xs -> T.concat (T.intersperse "\n" xs) T.++ "\n")-prop_unlinesconcatMap = T.unlines `eq1`        (\xs -> T.concatMap (T.++ "\n") xs)----------------------------------------------------------------------------- ** \"Set\" operations--prop_nubsort    = (\(xs :: [OrdA]) -> T.sort . T.nub $ xs )  `eq1`-                  (\xs       -> T.map T.head . T.group . T.sort $ xs)----------------------------------------------------------------------------- ** Ordered lists --prop_headsort = (T.head . T.sort) `eqnotnull1` (\x -> T.minimum (x :: [OrdA]))-prop_lastsort = (T.last . T.sort) `eqnotnull1` (\x -> T.maximum (x :: [OrdA]))----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubsortby    = (\f g (xs :: [OrdA]) -> T.sortBy f . T.nubBy g $ xs )  `eq3`-                    (\f g xs       -> T.map T.head . T.groupBy g . T.sortBy f $ xs)----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)----------------------------------------------------------------------------- * The \"generic\" operations----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering--  runTests "Basic interface" opts-    [ run prop_mapmap-    , run prop_maprepeat-    , run prop_mapreplicate-    ]--  runTests "List transformations" opts-    [ run prop_reverse-    ]--{--  runTests "Reducing lists (folds)" opts-    [-    ]--}--  runTests "Special folds" opts-    [ run prop_concatfoldr-    , run prop_concatmap-    , run prop_and-    , run prop_or-    , run prop_sum-    ]--  runTests "Scans" opts-    [ run prop_scanlfold-    , run prop_scanrfold-    ]--{--  runTests "Accumulating maps" opts-    [-    ]--}--  runTests "Infinite lists" opts-    [ run prop_replicate-    ]--{--  runTests "Unfolding" opts-    [-    ]--}--  runTests "Extracting sublists" opts-    [ run prop_break_span-    ]--{--  runTests "Predicates" opts-    [ run prop_isPrefixOfzip-    ]--}--{--  runTests "Searching by equality" opts-    [-    ]--}--  runTests "Searching by a predicate" opts-    [ run prop_filterfilter-    ]--  runTests "Indexing lists" opts-    [ run prop_filterelemIndices-    , run prop_filterfindIndices-    , run prop_findIndexfilter-    , run prop_elemIndexfilter-    , run prop_elemfindIndex-    ]--{--  runTests "Zipping" opts-    [-    ]--}--{--  runTests "Unzipping" opts-    [-    ]--}--  runTests "Functions on strings" opts-    [ run prop_unlinesconcat-    , run prop_unlinesconcatMap-    ]--  runTests "\"Set\" operations" opts-    [ run prop_nubsort-    ]--  runTests "Ordered lists" opts-    [ run prop_headsort-    , run prop_lastsort-    ]---  runTests "Eq style \"By\" operations" opts-    [ run prop_nubsortby     -- same issue as prop_sortBy in ListProperties-    ]-{--  runTests "Ord style \"By\" operations" opts-    [-    ]--  runTests "The \"generic\" operations" opts-    [-    ]--}----------------------------------------------------------------------------{--  runTests "Searching by equality" opts-    [-    ]--}--  runTests "Searching by a predicate" opts-    [ run prop_filterfilter-    ]--  runTests "Indexing lists" opts-    [ run prop_filterelemIndices-    , run prop_filterfindIndices-    , run prop_findIndexfilter-    , run prop_elemIndexfilter-    , run prop_elemfindIndex-    ]--{--  runTests "Zipping" opts-    [-    ]--}--{--  runTests "Unzipping" opts-    [-    ]--}--  runTests "Functions on strings" opts-    [ run prop_unlinesconcat-    , run prop_unlinesconcatMap-    ]--  runTests "\"Set\" operations" opts-    [ run prop_nubsort-    ]--  runTests "Ordered lists" opts-    [ run prop_headsort-    , run prop_lastsort-    ]---  runTests "Eq style \"By\" operations" opts-    [ run prop_nubsortby     -- same issue as prop_sortBy in ListProperties-    ]-{--  runTests "Ord style \"By\" operations" opts-    [-    ]--  runTests "The \"generic\" operations" opts-    [-    ]--}--------------------------------------------------------------------------
− tests/Properties/ListVsBase.hs
@@ -1,402 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs---------- Test the new list implementation against Data.List.-----import Properties.Utils-import System.IO--import qualified Properties.Monomorphic.List as Test        -- our implementation-import qualified Properties.Monomorphic.Base as Spec        -- current Data.List------- Data.List.Stream <=> Data.List-------------------------------------------------------------------------------- * Basic interface--prop_append     = (Test.++)     `eq2`           (Spec.++)-prop_head       = Test.head     `eqnotnull1`    Spec.head-prop_last       = Test.last     `eqnotnull1`    Spec.last-prop_tail       = Test.tail     `eqnotnull1`    Spec.tail-prop_init       = Test.init     `eqnotnull1`    Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map-prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate-prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'-prop_foldl1     = Test.foldl1   `eqnotnull2`    Spec.foldl1-prop_foldl1'    = Test.foldl1'  `eqnotnull2`    Spec.foldl1'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1   `eqnotnull2`    Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum  `eqnotnull1`    Spec.maximum-prop_minimum    = Test.minimum  `eqnotnull1`    Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr-prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate          `eqfinite2`     Spec.iterate-prop_repeat     = Test.repeat           `eqfinite1`     Spec.repeat-prop_replicate  = Test.replicate        `eq2`           Spec.replicate-prop_cycle      = \x -> not (null x) ==>-                  (Test.cycle           `eqfinite1`     Spec.cycle) x----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr          `eqfinite2`     Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile-prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem-prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter-prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = \xs n -> n >= 0 && n < length xs ==>-                          ((Test.!!)            `eq2`   (Spec.!!)) xs n-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3-prop_zip4       = Test.zip4             `eq4`   Spec.zip4-prop_zip5       = Test.zip5             `eq5`   Spec.zip5-prop_zip6       = Test.zip6             `eq6`   Spec.zip6-prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip-prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3-prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4-prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5-prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6-prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords          `eq1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists --prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--prop_sortBy             = Test.sortBy           `eq2`           Spec.sortBy-prop_insertBy           = Test.insertBy         `eq3`           Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eqnotnull2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eqnotnull2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`   Spec.genericLength-prop_genericTake        = \i -> i >= I 0 ==>-                          (Test.genericTake     `eq2`   Spec.genericTake) i-prop_genericDrop        = \i -> i >= I 0 ==>-                          (Test.genericDrop     `eq2`   Spec.genericDrop) i-prop_genericSplitAt     = \i -> i >= I 0 ==>-                          (Test.genericSplitAt  `eq2`   Spec.genericSplitAt) i-prop_genericIndex       = \xs i -> i >= I 0 && i < Spec.genericLength xs ==>-                          (Test.genericIndex    `eq2`   Spec.genericIndex) xs i-prop_genericReplicate   = \i -> i >= I 0 ==>-                          (Test.genericReplicate        `eq2`   Spec.genericReplicate) i----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing: Data.List.Stream <=> Data.List"-  putStrLn "=======================================\n"--  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map-    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate-    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-    ,run prop_scanr-    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile-    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-    ,run prop_isSuffixOf-    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem-    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter-    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts-    [run prop_zip-    ,run prop_zip3-    ,run prop_zip4-    ,run prop_zip5-    ,run prop_zip6-    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip-    ,run prop_unzip3-    ,run prop_unzip4-    ,run prop_unzip5-    ,run prop_unzip6-    ,run prop_unzip7-    ]--  runTests "Functions on strings" opts-    [run prop_lines-    ,run prop_words-    ,run prop_unlines-    ,run prop_unwords-    ]--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [run prop_sortBy        -- note issue here.-    ,run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]
− tests/Properties/ListVsSpec.hs
@@ -1,402 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs---------- Test the new list implementation against h98 lists.-----import Properties.Utils-import System.IO--import qualified Properties.Monomorphic.List as Test        -- our implementation-import qualified Properties.Monomorphic.Spec as Spec        -- H98 spec------- Data.List.Stream <=> Spec.List-------------------------------------------------------------------------------- * Basic interface--prop_append     = (Test.++)     `eq2`           (Spec.++)-prop_head       = Test.head     `eqnotnull1`    Spec.head-prop_last       = Test.last     `eqnotnull1`    Spec.last-prop_tail       = Test.tail     `eqnotnull1`    Spec.tail-prop_init       = Test.init     `eqnotnull1`    Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map-prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate-prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'-prop_foldl1     = Test.foldl1   `eqnotnull2`    Spec.foldl1-prop_foldl1'    = Test.foldl1'  `eqnotnull2`    Spec.foldl1'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1   `eqnotnull2`    Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum  `eqnotnull1`    Spec.maximum-prop_minimum    = Test.minimum  `eqnotnull1`    Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr-prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate          `eqfinite2`     Spec.iterate-prop_repeat     = Test.repeat           `eqfinite1`     Spec.repeat-prop_replicate  = Test.replicate        `eq2`           Spec.replicate-prop_cycle      = \x -> not (null x) ==>-                  (Test.cycle           `eqfinite1`     Spec.cycle) x----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr          `eqfinite2`     Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile-prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem-prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter-prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = \xs n -> n >= 0 && n < length xs ==>-                          ((Test.!!)            `eq2`   (Spec.!!)) xs n-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3-prop_zip4       = Test.zip4             `eq4`   Spec.zip4-prop_zip5       = Test.zip5             `eq5`   Spec.zip5-prop_zip6       = Test.zip6             `eq6`   Spec.zip6-prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip-prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3-prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4-prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5-prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6-prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords          `eq1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists --prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--prop_sortBy             = Test.sortBy           `eq2`           Spec.sortBy-prop_insertBy           = Test.insertBy         `eq3`           Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eqnotnull2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eqnotnull2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`   Spec.genericLength-prop_genericTake        = \i -> i >= I 0 ==>-                          (Test.genericTake     `eq2`   Spec.genericTake) i-prop_genericDrop        = \i -> i >= I 0 ==>-                          (Test.genericDrop     `eq2`   Spec.genericDrop) i-prop_genericSplitAt     = \i -> i >= I 0 ==>-                          (Test.genericSplitAt  `eq2`   Spec.genericSplitAt) i-prop_genericIndex       = \xs i -> i >= I 0 && i < Spec.genericLength xs ==>-                          (Test.genericIndex    `eq2`   Spec.genericIndex) xs i-prop_genericReplicate   = \i -> i >= I 0 ==>-                          (Test.genericReplicate        `eq2`   Spec.genericReplicate) i----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing: Data.List.Stream <=> Spec.List"-  putStrLn "=======================================\n"--  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map-    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate-    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-    ,run prop_scanr-    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile-    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-    ,run prop_isSuffixOf-    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem-    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter-    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts-    [run prop_zip-    ,run prop_zip3-    ,run prop_zip4-    ,run prop_zip5-    ,run prop_zip6-    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip-    ,run prop_unzip3-    ,run prop_unzip4-    ,run prop_unzip5-    ,run prop_unzip6-    ,run prop_unzip7-    ]--  runTests "Functions on strings" opts-    [run prop_lines-    ,run prop_words-    ,run prop_unlines-    ,run prop_unwords-    ]--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [run prop_sortBy        -- note issue here.-    ,run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]
− tests/Properties/Monomorphic/Base.hs
@@ -1,321 +0,0 @@------ The Data.List api----module Properties.Monomorphic.Base where--import Properties.Utils--import qualified Data.List as Spec---- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (Spec.++)-head            = Spec.head-last            = Spec.last-tail            = Spec.tail-init            = Spec.init-null            = Spec.null-length          = Spec.length---- * List transformations-map             = Spec.map-reverse         = Spec.reverse-intersperse     = Spec.intersperse---- intercalate     = -- Spec.intercalate-intercalate xs xss = Spec.concat (Spec.intersperse xs xss)--transpose       = Spec.transpose---- * Reducing lists (folds)-foldl           = Spec.foldl-foldl'          = Spec.foldl'-foldl1          = Spec.foldl1-foldl1'         = Spec.foldl1'-foldr           = Spec.foldr-foldr1          = Spec.foldr1---- ** Special folds-concat          = Spec.concat-concatMap       = Spec.concatMap-and             = Spec.and-or              = Spec.or-any             = Spec.any-all             = Spec.all-sum             = Spec.sum-product         = Spec.product-maximum         = Spec.maximum-minimum         = Spec.minimum---- * Building lists--- ** Scans-scanl           = Spec.scanl-scanl1          = Spec.scanl1-scanr           = Spec.scanr-scanr1          = Spec.scanr1---- ** Accumulating maps-mapAccumL       = Spec.mapAccumL-mapAccumR       = Spec.mapAccumR---- ** Infinite lists-iterate         = Spec.iterate-repeat          = Spec.repeat-replicate       = Spec.replicate-cycle           = Spec.cycle---- ** Unfolding-unfoldr         = Spec.unfoldr---- * Sublists--- ** Extracting sublists-take            = Spec.take-drop            = Spec.drop-splitAt         = Spec.splitAt-takeWhile       = Spec.takeWhile-dropWhile       = Spec.dropWhile-span            = Spec.span-break           = Spec.break-group           = Spec.group-inits           = Spec.inits-tails           = Spec.tails---- * Predicates-isPrefixOf      = Spec.isPrefixOf-isSuffixOf      = Spec.isSuffixOf-isInfixOf       = Spec.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = Spec.elem-notElem         = Spec.notElem-lookup          = Spec.lookup---- ** Searching with a predicate-find            = Spec.find-filter          = Spec.filter-partition       = Spec.partition---- * Indexing lists-(!!)            = (Spec.!!)-elemIndex       = Spec.elemIndex-elemIndices     = Spec.elemIndices-findIndex       = Spec.findIndex-findIndices     = Spec.findIndices---- * Zipping and unzipping lists-zip             = Spec.zip-zip3            = Spec.zip3-zip4            = Spec.zip4-zip5            = Spec.zip5-zip6            = Spec.zip6-zip7            = Spec.zip7-zipWith         = Spec.zipWith-zipWith3        = Spec.zipWith3-zipWith4        = Spec.zipWith4-zipWith5        = Spec.zipWith5-zipWith6        = Spec.zipWith6-zipWith7        = Spec.zipWith7-unzip           = Spec.unzip-unzip3          = Spec.unzip3-unzip4          = Spec.unzip4-unzip5          = Spec.unzip5-unzip6          = Spec.unzip6-unzip7          = Spec.unzip7---- * Special lists--- ** Functions on strings-lines           = Spec.lines-words           = Spec.words-unlines         = Spec.unlines-unwords         = Spec.unwords---- ** \"Set\" operations-nub             = Spec.nub-delete          = Spec.delete-(\\)            = (Spec.\\)-union           = Spec.union-intersect       = Spec.intersect---- ** Ordered lists -sort            = Spec.sort-insert          = Spec.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Spec.nubBy-deleteBy        = Spec.deleteBy-deleteFirstsBy  = Spec.deleteFirstsBy-unionBy         = Spec.unionBy-intersectBy     = Spec.intersectBy-groupBy         = Spec.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = Spec.sortBy-insertBy        = Spec.insertBy-maximumBy       = Spec.maximumBy-minimumBy       = Spec.minimumBy---- * The \"generic\" operations-genericLength           = Spec.genericLength-genericTake             = Spec.genericTake-genericDrop             = Spec.genericDrop-genericSplitAt          = Spec.genericSplitAt-genericIndex            = Spec.genericIndex-genericReplicate        = Spec.genericReplicate
− tests/Properties/Monomorphic/List.hs
@@ -1,319 +0,0 @@-module Properties.Monomorphic.List where------- just test the List api-----import Properties.Utils--import qualified Data.List.Stream as List---- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (List.++)-head            = List.head-last            = List.last-tail            = List.tail-init            = List.init-null            = List.null-length          = List.length---- * List transformations-map             = List.map-reverse         = List.reverse-intersperse     = List.intersperse-intercalate     = List.intercalate-transpose       = List.transpose---- * Reducing lists (folds)-foldl           = List.foldl-foldl'          = List.foldl'-foldl1          = List.foldl1-foldl1'         = List.foldl1'-foldr           = List.foldr-foldr1          = List.foldr1---- ** Special folds-concat          = List.concat-concatMap       = List.concatMap-and             = List.and-or              = List.or-any             = List.any-all             = List.all-sum             = List.sum-product         = List.product-maximum         = List.maximum-minimum         = List.minimum---- * Building lists--- ** Scans-scanl           = List.scanl-scanl1          = List.scanl1-scanr           = List.scanr-scanr1          = List.scanr1---- ** Accumulating maps-mapAccumL       = List.mapAccumL-mapAccumR       = List.mapAccumR---- ** Infinite lists-iterate         = List.iterate-repeat          = List.repeat-replicate       = List.replicate-cycle           = List.cycle---- ** Unfolding-unfoldr         = List.unfoldr---- * Sublists--- ** Extracting sublists-take            = List.take-drop            = List.drop-splitAt         = List.splitAt-takeWhile       = List.takeWhile-dropWhile       = List.dropWhile-span            = List.span-break           = List.break-group           = List.group-inits           = List.inits-tails           = List.tails---- * Predicates-isPrefixOf      = List.isPrefixOf-isSuffixOf      = List.isSuffixOf-isInfixOf       = List.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = List.elem-notElem         = List.notElem-lookup          = List.lookup---- ** Searching with a predicate-find            = List.find-filter          = List.filter-partition       = List.partition---- * Indexing lists-(!!)            = (List.!!)-elemIndex       = List.elemIndex-elemIndices     = List.elemIndices-findIndex       = List.findIndex-findIndices     = List.findIndices---- * Zipping and unzipping lists-zip             = List.zip-zip3            = List.zip3-zip4            = List.zip4-zip5            = List.zip5-zip6            = List.zip6-zip7            = List.zip7-zipWith         = List.zipWith-zipWith3        = List.zipWith3-zipWith4        = List.zipWith4-zipWith5        = List.zipWith5-zipWith6        = List.zipWith6-zipWith7        = List.zipWith7-unzip           = List.unzip-unzip3          = List.unzip3-unzip4          = List.unzip4-unzip5          = List.unzip5-unzip6          = List.unzip6-unzip7          = List.unzip7---- * Special lists--- ** Functions on strings-lines           = List.lines-words           = List.words-unlines         = List.unlines-unwords         = List.unwords---- ** \"Set\" operations-nub             = List.nub-delete          = List.delete-(\\)            = (List.\\)-union           = List.union-intersect       = List.intersect---- ** Ordered lists -sort            = List.sort-insert          = List.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = List.nubBy-deleteBy        = List.deleteBy-deleteFirstsBy  = List.deleteFirstsBy-unionBy         = List.unionBy-intersectBy     = List.intersectBy-groupBy         = List.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = List.sortBy-insertBy        = List.insertBy-maximumBy       = List.maximumBy-minimumBy       = List.minimumBy---- * The \"generic\" operations-genericLength           = List.genericLength-genericTake             = List.genericTake-genericDrop             = List.genericDrop-genericSplitAt          = List.genericSplitAt-genericIndex            = List.genericIndex-genericReplicate        = List.genericReplicate
− tests/Properties/Monomorphic/Spec.hs
@@ -1,316 +0,0 @@-module Properties.Monomorphic.Spec where--import Properties.Utils--import qualified Spec.List as Spec-import qualified Spec.ListExts as Spec---- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (Spec.++)-head            = Spec.head-last            = Spec.last-tail            = Spec.tail-init            = Spec.init-null            = Spec.null-length          = Spec.length---- * List transformations-map             = Spec.map-reverse         = Spec.reverse-intersperse     = Spec.intersperse-intercalate     = Spec.intercalate-transpose       = Spec.transpose---- * Reducing lists (folds)-foldl           = Spec.foldl-foldl'          = Spec.foldl'-foldl1          = Spec.foldl1-foldl1'         = Spec.foldl1'-foldr           = Spec.foldr-foldr1          = Spec.foldr1---- ** Special folds-concat          = Spec.concat-concatMap       = Spec.concatMap-and             = Spec.and-or              = Spec.or-any             = Spec.any-all             = Spec.all-sum             = Spec.sum-product         = Spec.product-maximum         = Spec.maximum-minimum         = Spec.minimum---- * Building lists--- ** Scans-scanl           = Spec.scanl-scanl1          = Spec.scanl1-scanr           = Spec.scanr-scanr1          = Spec.scanr1---- ** Accumulating maps-mapAccumL       = Spec.mapAccumL-mapAccumR       = Spec.mapAccumR---- ** Infinite lists-iterate         = Spec.iterate-repeat          = Spec.repeat-replicate       = Spec.replicate-cycle           = Spec.cycle---- ** Unfolding-unfoldr         = Spec.unfoldr---- * Sublists--- ** Extracting sublists-take            = Spec.take-drop            = Spec.drop-splitAt         = Spec.splitAt-takeWhile       = Spec.takeWhile-dropWhile       = Spec.dropWhile-span            = Spec.span-break           = Spec.break-group           = Spec.group-inits           = Spec.inits-tails           = Spec.tails---- * Predicates-isPrefixOf      = Spec.isPrefixOf-isSuffixOf      = Spec.isSuffixOf-isInfixOf       = Spec.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = Spec.elem-notElem         = Spec.notElem-lookup          = Spec.lookup---- ** Searching with a predicate-find            = Spec.find-filter          = Spec.filter-partition       = Spec.partition---- * Indexing lists-(!!)            = (Spec.!!)-elemIndex       = Spec.elemIndex-elemIndices     = Spec.elemIndices-findIndex       = Spec.findIndex-findIndices     = Spec.findIndices---- * Zipping and unzipping lists-zip             = Spec.zip-zip3            = Spec.zip3-zip4            = Spec.zip4-zip5            = Spec.zip5-zip6            = Spec.zip6-zip7            = Spec.zip7-zipWith         = Spec.zipWith-zipWith3        = Spec.zipWith3-zipWith4        = Spec.zipWith4-zipWith5        = Spec.zipWith5-zipWith6        = Spec.zipWith6-zipWith7        = Spec.zipWith7-unzip           = Spec.unzip-unzip3          = Spec.unzip3-unzip4          = Spec.unzip4-unzip5          = Spec.unzip5-unzip6          = Spec.unzip6-unzip7          = Spec.unzip7---- * Special lists--- ** Functions on strings-lines           = Spec.lines-words           = Spec.words-unlines         = Spec.unlines-unwords         = Spec.unwords---- ** \"Set\" operations-nub             = Spec.nub-delete          = Spec.delete-(\\)            = (Spec.\\)-union           = Spec.union-intersect       = Spec.intersect---- ** Ordered lists -sort            = Spec.sort-insert          = Spec.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Spec.nubBy-deleteBy        = Spec.deleteBy-deleteFirstsBy  = Spec.deleteFirstsBy-unionBy         = Spec.unionBy-intersectBy     = Spec.intersectBy-groupBy         = Spec.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = Spec.sortBy-insertBy        = Spec.insertBy-maximumBy       = Spec.maximumBy-minimumBy       = Spec.minimumBy---- * The \"generic\" operations-genericLength           = Spec.genericLength-genericTake             = Spec.genericTake-genericDrop             = Spec.genericDrop-genericSplitAt          = Spec.genericSplitAt-genericIndex            = Spec.genericIndex-genericReplicate        = Spec.genericReplicate
− tests/Properties/Monomorphic/SpecStream.hs
@@ -1,335 +0,0 @@--- Haskell98 list spec wrapped in a stream interface so we can compare it to--- the stream implementation and test using streams that contain Skips.--module Properties.Monomorphic.SpecStream where--import Properties.Utils--import qualified Spec.List as Spec-import qualified Spec.ListExts as Spec-import Data.Stream as Stream (Stream, stream, unstream)---- * Basic interface-cons            :: A -> Stream A -> Stream A-snoc            :: Stream A -> A -> Stream A-(++)            :: Stream A -> Stream A -> Stream A-head            :: Stream A -> A-last            :: Stream A -> A-tail            :: Stream A -> Stream A-init            :: Stream A -> Stream A-null            :: Stream A -> Bool-length          :: Stream A -> Int---- * List transformations-map             :: (A -> B) -> Stream A -> Stream B-reverse         :: Stream A -> Stream A-intersperse     :: A -> Stream A -> Stream A-intercalate     :: Stream A -> Stream (Stream A) -> Stream A-transpose       :: Stream (Stream A) -> Stream (Stream A)---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> Stream A -> B-foldl'          :: (B -> A -> B) -> B -> Stream A -> B-foldl1          :: (A -> A -> A) -> Stream A -> A-foldl1'         :: (A -> A -> A) -> Stream A -> A-foldr           :: (A -> B -> B) -> B -> Stream A -> B-foldr1          :: (A -> A -> A) -> Stream A -> A---- ** Special folds-concat          :: Stream (Stream A) -> Stream A-concatMap       :: (A -> Stream B) -> Stream A -> Stream B-and             :: Stream Bool -> Bool-or              :: Stream Bool -> Bool-any             :: (A -> Bool) -> Stream A -> Bool-all             :: (A -> Bool) -> Stream A -> Bool-sum             :: Stream N -> N-product         :: Stream N -> N-maximum         :: Stream OrdA -> OrdA-minimum         :: Stream OrdA -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> Stream B -> Stream A-scanl1          :: (A -> A -> A) -> Stream A -> Stream A-scanr           :: (A -> B -> B) -> B -> Stream A -> Stream B-scanr1          :: (A -> A -> A) -> Stream A -> Stream A---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> Stream A -> (C, Stream B)-mapAccumR       :: (C -> A -> (C, B)) -> C -> Stream A -> (C, Stream B)---- ** Infinite lists-iterate         :: (A -> A) -> A -> Stream A-repeat          :: A -> Stream A-replicate       :: Int -> A -> Stream A-cycle           :: Stream A -> Stream A---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> Stream A---- * Sublists--- ** Extracting sublists-take            :: Int -> Stream A -> Stream A-drop            :: Int -> Stream A -> Stream A-splitAt         :: Int -> Stream A -> ([A], [A])-takeWhile       :: (A -> Bool) -> Stream A -> Stream A-dropWhile       :: (A -> Bool) -> Stream A -> Stream A-span            :: (A -> Bool) -> Stream A -> ([A], [A])-break           :: (A -> Bool) -> Stream A -> ([A], [A])-group           :: Stream A -> Stream (Stream A)-inits           :: Stream A -> Stream (Stream A)-tails           :: Stream A -> Stream (Stream A)---- * Predicates-isPrefixOf      :: Stream A -> Stream A -> Bool-isSuffixOf      :: Stream A -> Stream A -> Bool-isInfixOf       :: Stream A -> Stream A -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> Stream A -> Bool-notElem         :: A -> Stream A -> Bool-lookup          :: A -> Stream (A, B) -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> Stream A -> Maybe A-filter          :: (A -> Bool) -> Stream A -> Stream A-partition       :: (A -> Bool) -> Stream A -> ([A], [A])---- * Indexing lists-(!!)            :: Stream A -> Int -> A-elemIndex       :: A -> Stream A -> Maybe Int-elemIndices     :: A -> Stream A -> Stream Int-findIndex       :: (A -> Bool) -> Stream A -> Maybe Int-findIndices     :: (A -> Bool) -> Stream A -> Stream Int---- * Zipping and unzipping lists-zip             :: Stream A -> Stream B -> Stream (A, B)-zip3            :: Stream A -> Stream B -> Stream C -> Stream (A, B, C)-zip4            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream (A, B, C, D)-zip5            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream (A, B, C, D, E)-zip6            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream (A, B, C, D, E, F)-zip7            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G -> Stream (A, B, C, D, E, F, G)-zipWith         :: (A -> B -> C) -> Stream A -> Stream B -> Stream C-zipWith3        :: (A -> B -> C -> D) -> Stream A -> Stream B -> Stream C -> Stream D-zipWith4        :: (A -> B -> C -> D -> E) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E-zipWith5        :: (A -> B -> C -> D -> E -> F) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G -> Stream H-unzip           :: Stream (A, B) -> ([A], [B])-unzip3          :: Stream (A, B, C) -> (Stream A, Stream B, Stream C)-unzip4          :: Stream (A, B, C, D) -> (Stream A, Stream B, Stream C, Stream D)-unzip5          :: Stream (A, B, C, D, E) -> (Stream A, Stream B, Stream C, Stream D, Stream E)-unzip6          :: Stream (A, B, C, D, E, F) -> (Stream A, Stream B, Stream C, Stream D, Stream E, Stream F)-unzip7          :: Stream (A, B, C, D, E, F, G) -> (Stream A, Stream B, Stream C, Stream D, Stream E, Stream F, Stream G)---- * Special lists--- ** Functions on strings-lines           :: Stream Char -> Stream String-words           :: Stream Char -> Stream String-unlines         :: Stream String -> Stream Char-unwords         :: Stream String -> Stream Char---- ** \"Set\" operations-nub             :: Stream A -> Stream A-delete          :: A -> Stream A -> Stream A-(\\)            :: Stream A -> Stream A -> Stream A-union           :: Stream A -> Stream A -> Stream A-intersect       :: Stream A -> Stream A -> Stream A---- ** Ordered lists-sort            :: Stream OrdA -> Stream OrdA-insert          :: OrdA -> Stream OrdA -> Stream OrdA---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> Stream A -> Stream A-deleteBy        :: (A -> A -> Bool) -> A -> Stream A -> Stream A-deleteFirstsBy  :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A-unionBy         :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A-intersectBy     :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A-groupBy         :: (A -> A -> Bool) -> Stream A -> Stream (Stream A)---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> Stream A -> Stream A-insertBy        :: (A -> A -> Ordering) -> A -> Stream A -> Stream A-maximumBy       :: (A -> A -> Ordering) -> Stream A -> A-minimumBy       :: (A -> A -> Ordering) -> Stream A -> A---- * The \"generic\" operations-genericLength           :: Stream A -> I-genericTake             :: I -> Stream A -> Stream A-genericDrop             :: I -> Stream A -> Stream A-genericSplitAt          :: I -> Stream A -> ([A], [A])-genericIndex            :: Stream A -> I -> A-genericReplicate        :: I -> A -> Stream A---s :: [a] -> Stream a-s = Stream.stream--u :: Stream a -> [a]-u = Stream.unstream--ss :: [[a]] -> Stream (Stream a)-ss = s . Spec.map s--uu :: Stream (Stream a) -> [[a]]-uu = Spec.map u . u---- * Basic interface-cons            = \x  xs -> s $ (:)       x (u xs)-snoc            = \xs x  -> s $ (u xs) Spec.++ [x]-(++)            = \xs ys -> s $ (Spec.++)   (u xs) (u ys)-head            = \xs    ->     Spec.head   (u xs)-last            = \xs    ->     Spec.last   (u xs)-tail            = \xs    -> s $ Spec.tail   (u xs)-init            = \xs    -> s $ Spec.init   (u xs)-null            = \xs    ->     Spec.null   (u xs)-length          = \xs    ->     Spec.length (u xs)---- * List transformations-map             = \f xs     -> s  $ Spec.map         f (u xs)-reverse         = \  xs     -> s  $ Spec.reverse       (u xs)-intersperse     = \x xs     -> s  $ Spec.intersperse x (u xs)-intercalate     = \  xs xss -> s  $ Spec.intercalate   (u xs) (uu xss)-transpose       = \     xss -> ss $ Spec.transpose            (uu xss)---- * Reducing lists (folds)-foldl           = \f z xs -> Spec.foldl   f z (u xs)-foldl'          = \f z xs -> Spec.foldl'  f z (u xs)-foldl1          = \f   xs -> Spec.foldl1  f   (u xs)-foldl1'         = \f   xs -> Spec.foldl1' f   (u xs)-foldr           = \f z xs -> Spec.foldr   f z (u xs)-foldr1          = \f   xs -> Spec.foldr1  f   (u xs)---- ** Special folds-concat          = \ xss -> s $ Spec.concat    (uu xss)-concatMap       = \f xs -> s $ Spec.concatMap (u . f) (u xs)-and             = \  xs ->     Spec.and       (u xs)-or              = \  xs ->     Spec.or        (u xs)-any             = \f xs ->     Spec.any     f (u xs)-all             = \f xs ->     Spec.all     f (u xs)-sum             = \  xs ->     Spec.sum       (u xs)-product         = \  xs ->     Spec.product   (u xs)-maximum         = \  xs ->     Spec.maximum   (u xs)-minimum         = \  xs ->     Spec.minimum   (u xs)---- * Building lists--- ** Scans-scanl           = \f z xs -> s $ Spec.scanl  f z (u xs)-scanl1          = \f   xs -> s $ Spec.scanl1 f   (u xs)-scanr           = \f z xs -> s $ Spec.scanr  f z (u xs)-scanr1          = \f   xs -> s $ Spec.scanr1 f   (u xs)---- ** Accumulating maps-mapAccumL       = \f z xs -> (\(a,b)->(a,s b)) $ Spec.mapAccumL f z (u xs)-mapAccumR       = \f z xs -> (\(a,b)->(a,s b)) $ Spec.mapAccumR f z (u xs)---- ** Infinite lists-iterate         = \f x -> s $ Spec.iterate   f x-repeat          = \  x -> s $ Spec.repeat      x-replicate       = \n x -> s $ Spec.replicate n x-cycle           = \ xs -> s $ Spec.cycle     (u xs)---- ** Unfolding-unfoldr         = \f x -> s $ Spec.unfoldr f x---- * Sublists--- ** Extracting sublists-take            = \n xs -> s  $ Spec.take      n (u xs)-drop            = \n xs -> s  $ Spec.drop      n (u xs)-splitAt         = \n xs ->      Spec.splitAt   n (u xs)-takeWhile       = \f xs -> s  $ Spec.takeWhile f (u xs)-dropWhile       = \f xs -> s  $ Spec.dropWhile f (u xs)-span            = \f xs ->      Spec.span      f (u xs)-break           = \f xs ->      Spec.break     f (u xs)-group           = \  xs -> ss $ Spec.group       (u xs)-inits           = \  xs -> ss $ Spec.inits       (u xs)-tails           = \  xs -> ss $ Spec.tails       (u xs)---- * Predicates-isPrefixOf      = \xs ys -> Spec.isPrefixOf (u xs) (u ys)-isSuffixOf      = \xs ys -> Spec.isSuffixOf (u xs) (u ys)-isInfixOf       = \xs ys -> Spec.isInfixOf  (u xs) (u ys)---- * Searching lists--- ** Searching by equality-elem            = \x xs -> Spec.elem    x (u xs)-notElem         = \x xs -> Spec.notElem x (u xs)-lookup          = \x xs -> Spec.lookup  x (u xs)---- ** Searching with a predicate-find            = \f xs ->      Spec.find      f (u xs)-filter          = \f xs -> s  $ Spec.filter    f (u xs)-partition       = \f xs ->      Spec.partition f (u xs)---- * Indexing lists-(!!)            = \xs n ->     (Spec.!!)          (u xs) n-elemIndex       = \x xs ->     Spec.elemIndex   x (u xs)-elemIndices     = \x xs -> s $ Spec.elemIndices x (u xs)-findIndex       = \f xs ->     Spec.findIndex   f (u xs)-findIndices     = \f xs -> s $ Spec.findIndices f (u xs)---- * Zipping and unzipping lists-zip             = \a b -> s $ Spec.zip (u a) (u b)-zip3            = \a b c -> s $ Spec.zip3 (u a) (u b) (u c)-zip4            = \a b c d -> s $ Spec.zip4 (u a) (u b) (u c) (u d)-zip5            = \a b c d e -> s $ Spec.zip5 (u a) (u b) (u c) (u d) (u e)-zip6            = \a b c d e f -> s $ Spec.zip6 (u a) (u b) (u c) (u d) (u e) (u f)-zip7            = \a b c d e f g -> s $ Spec.zip7 (u a) (u b) (u c) (u d) (u e) (u f) (u g)-zipWith         = \h a b -> s $ Spec.zipWith h (u a) (u b)-zipWith3        = \h a b c -> s $ Spec.zipWith3 h (u a) (u b) (u c)-zipWith4        = \h a b c d -> s $ Spec.zipWith4 h (u a) (u b) (u c) (u d)-zipWith5        = \h a b c d e -> s $ Spec.zipWith5 h (u a) (u b) (u c) (u d) (u e)-zipWith6        = \h a b c d e f -> s $ Spec.zipWith6 h (u a) (u b) (u c) (u d) (u e) (u f)-zipWith7        = \h a b c d e f g -> s $ Spec.zipWith7 h (u a) (u b) (u c) (u d) (u e) (u f) (u g)-unzip           = \xs -> {-(\(a,b)->(s a,s b)) $-} Spec.unzip (u xs)-unzip3          = \xs -> (\(a,b,c)->(s a,s b,s c)) $ Spec.unzip3 (u xs)-unzip4          = \xs -> (\(a,b,c,d)->(s a,s b,s c,s d)) $ Spec.unzip4 (u xs)-unzip5          = \xs -> (\(a,b,c,d,e)->(s a,s b,s c,s d,s e)) $ Spec.unzip5 (u xs)-unzip6          = \xs -> (\(a,b,c,d,e,f)->(s a,s b,s c,s d,s e,s f)) $ Spec.unzip6 (u xs)-unzip7          = \xs -> (\(a,b,c,d,e,f,g)->(s a,s b,s c,s d,s e,s f,s g)) $ Spec.unzip7 (u xs)---- * Special lists--- ** Functions on strings-lines           = \x -> s $ Spec.lines (u x)-words           = \x -> s $ Spec.words (u x)-unlines         = \x -> s $ Spec.unlines (u x)-unwords         = \x -> s $ Spec.unwords (u x)---- ** \"Set\" operations-nub             = \  xs    -> s $ Spec.nub       (u xs)-delete          = \x xs    -> s $ Spec.delete x  (u xs)-(\\)            = \  xs ys -> s $ (Spec.\\)      (u xs) (u ys)-union           = \  xs ys -> s $ Spec.union     (u xs) (u ys)-intersect       = \  xs ys -> s $ Spec.intersect (u xs) (u ys)---- ** Ordered lists-sort            = \  xs -> s $ Spec.sort     (u xs)-insert          = \x xs -> s $ Spec.insert x (u xs)---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = \f   xs    -> s  $ Spec.nubBy          f   (u xs)-deleteBy        = \f x xs    -> s  $ Spec.deleteBy       f x (u xs)-deleteFirstsBy  = \f   xs ys -> s  $ Spec.deleteFirstsBy f   (u xs) (u ys)-unionBy         = \f   xs ys -> s  $ Spec.unionBy        f   (u xs) (u ys)-intersectBy     = \f   xs ys -> s  $ Spec.intersectBy    f   (u xs) (u ys)-groupBy         = \f   xs    -> ss $ Spec.groupBy        f   (u xs)---- *** User-supplied comparison (replacing an Ord context)-sortBy          = \f   xs -> s $ Spec.sortBy    f   (u xs)-insertBy        = \f x xs -> s $ Spec.insertBy  f x (u xs)-maximumBy       = \f   xs ->     Spec.maximumBy f   (u xs)-minimumBy       = \f   xs ->     Spec.minimumBy f   (u xs)---- * The \"generic\" operations-genericLength           = \  xs ->      Spec.genericLength      (u xs)-genericTake             = \n xs -> s  $ Spec.genericTake      n (u xs)-genericDrop             = \n xs -> s  $ Spec.genericDrop      n (u xs)-genericSplitAt          = \n xs ->      Spec.genericSplitAt   n (u xs)-genericIndex            = \xs n ->      Spec.genericIndex       (u xs) n-genericReplicate        = \n x  -> s  $ Spec.genericReplicate n x
− tests/Properties/Monomorphic/Stream.hs
@@ -1,362 +0,0 @@------ raw stream interface, no list wrappers------ These specify the versions used when fusion occurs.------ So we can check our stream implementations, which are only used when--- fusion happens, are correct.-----module Properties.Monomorphic.Stream where--import Prelude -import qualified Prelude --import Properties.Utils--import qualified Data.Stream as Stream-import Data.Stream (Stream)----- * Basic interface-cons            :: A -> Stream A -> Stream A-snoc            :: Stream A -> A -> Stream A-append          :: Stream A -> Stream A -> Stream A-head            :: Stream A -> A-last            :: Stream A -> A-tail            :: Stream A -> Stream A-init            :: Stream A -> Stream A-null            :: Stream A -> Bool-length          :: Stream A -> Int---- * List transformations-map             :: (A -> B) -> Stream A -> Stream B---reverse         :: Stream A -> Stream A-intersperse     :: A -> Stream A -> Stream A---intercalate     :: Stream A -> Stream (Stream A) -> Stream A---transpose       :: Stream (Stream A) -> Stream (Stream A)---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> Stream A -> B-foldl'          :: (B -> A -> B) -> B -> Stream A -> B-foldl1          :: (A -> A -> A) -> Stream A -> A-foldl1'         :: (A -> A -> A) -> Stream A -> A-foldr           :: (A -> B -> B) -> B -> Stream A -> B-foldr1          :: (A -> A -> A) -> Stream A -> A---- ** Special folds--- concat          :: Stream (Stream A) -> Stream A-concatMap       :: (A -> Stream B) -> Stream A -> Stream B-and             :: Stream Bool -> Bool-or              :: Stream Bool -> Bool-any             :: (A -> Bool) -> Stream A -> Bool-all             :: (A -> Bool) -> Stream A -> Bool-sum             :: Stream N -> N-product         :: Stream N -> N-maximum         :: Stream OrdA -> OrdA-minimum         :: Stream OrdA -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> Stream B -> Stream A-scanl1          :: (A -> A -> A) -> Stream A -> Stream A---scanr           :: (A -> B -> B) -> B -> Stream A -> Stream B---scanr1          :: (A -> A -> A) -> Stream A -> Stream A---- ** Accumulating maps---mapAccumL       :: (C -> A -> (C, B)) -> C -> Stream A -> (C, Stream B)---mapAccumR       :: (C -> A -> (C, B)) -> C -> Stream A -> (C, Stream B)---- ** Infinite lists-iterate         :: (A -> A) -> A -> Stream A-repeat          :: A -> Stream A-replicate       :: Int -> A -> Stream A-cycle           :: Stream A -> Stream A---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> Stream A---- * Sublists--- ** Extracting sublists-take            :: Int -> Stream A -> Stream A-drop            :: Int -> Stream A -> Stream A-splitAt         :: Int -> Stream A -> ([A], [A])-takeWhile       :: (A -> Bool) -> Stream A -> Stream A-dropWhile       :: (A -> Bool) -> Stream A -> Stream A---span            :: (A -> Bool) -> Stream A -> (Stream A, Stream A)---break           :: (A -> Bool) -> Stream A -> (Stream A, Stream A)---group           :: Stream A -> Stream (Stream A)---inits           :: Stream A -> Stream (Stream A)---tails           :: Stream A -> Stream (Stream A)---- * Predicates-isPrefixOf      :: Stream A -> Stream A -> Bool---isSuffixOf      :: Stream A -> Stream A -> Bool---isInfixOf       :: Stream A -> Stream A -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> Stream A -> Bool---notElem         :: A -> Stream A -> Bool-lookup          :: A -> Stream (A, B) -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> Stream A -> Maybe A-filter          :: (A -> Bool) -> Stream A -> Stream A---partition       :: (A -> Bool) -> Stream A -> (Stream A, Stream A)---- * Indexing lists-(!!)            :: Stream A -> Int -> A-elemIndex       :: A -> Stream A -> Maybe Int-findIndex       :: (A -> Bool) -> Stream A -> Maybe Int-elemIndices     :: A -> Stream A -> Stream Int-findIndices     :: (A -> Bool) -> Stream A -> Stream Int---- * Zipping and unzipping lists-zip             :: Stream A -> Stream B -> Stream (A, B)-zip3            :: Stream A -> Stream B -> Stream C -> Stream (A, B, C)----zip4            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream (A, B, C, D)---zip5            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream (A, B, C, D, E)---zip6            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream (A, B, C, D, E, F)---zip7            :: Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G -> Stream (A, B, C, D, E, F, G)--zipWith         :: (A -> B -> C) -> Stream A -> Stream B -> Stream C-zipWith3        :: (A -> B -> C -> D) -> Stream A -> Stream B -> Stream C -> Stream D----zipWith4        :: (A -> B -> C -> D -> E) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E---zipWith5        :: (A -> B -> C -> D -> E -> F) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F---zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G---zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> Stream A -> Stream B -> Stream C -> Stream D -> Stream E -> Stream F -> Stream G -> Stream H--unzip           :: Stream (A, B) -> ([A], [B])--{----unzip3          :: Stream (A, B, C) -> (Stream A, Stream B, Stream C)---unzip4          :: Stream (A, B, C, D) -> (Stream A, Stream B, Stream C, Stream D)---unzip5          :: Stream (A, B, C, D, E) -> (Stream A, Stream B, Stream C, Stream D, Stream E)---unzip6          :: Stream (A, B, C, D, E, F) -> (Stream A, Stream B, Stream C, Stream D, Stream E, Stream F)---unzip7          :: Stream (A, B, C, D, E, F, G) -> (Stream A, Stream B, Stream C, Stream D, Stream E, Stream F, Stream G)--}---- * Special lists--- ** Functions on strings---lines           :: Stream Char -> Stream [Char]-----words           :: String -> Stream String---unlines         :: Stream String -> String---unwords         :: Stream String -> String---- ** \"Set\" operations---nub             :: Stream A -> Stream A---delete          :: A -> Stream A -> Stream A---(\\)            :: Stream A -> Stream A -> Stream A---union           :: Stream A -> Stream A -> Stream A---intersect       :: Stream A -> Stream A -> Stream A---- ** Ordered lists ---sort            :: Stream OrdA -> Stream OrdA---insert          :: OrdA -> Stream OrdA -> Stream OrdA---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)---nubBy           :: (A -> A -> Bool) -> Stream A -> Stream A---deleteBy        :: (A -> A -> Bool) -> A -> Stream A -> Stream A---deleteFirstsBy  :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A---unionBy         :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A---intersectBy     :: (A -> A -> Bool) -> Stream A -> Stream A -> Stream A---groupBy         :: (A -> A -> Bool) -> Stream A -> Stream (Stream A)---- *** User-supplied comparison (replacing an Ord context)---sortBy          :: (A -> A -> Ordering) -> Stream A -> Stream A--insertBy        :: (A -> A -> Ordering) -> A -> Stream A -> Stream A-maximumBy       :: (A -> A -> Ordering) -> Stream A -> A-minimumBy       :: (A -> A -> Ordering) -> Stream A -> A---- * The \"generic\" operations--genericLength           :: Stream A -> I-genericTake             :: I -> Stream A -> Stream A-genericDrop             :: I -> Stream A -> Stream A-genericSplitAt          :: I -> Stream A -> ([A], [A])-genericIndex            :: Stream A -> I -> A----genericReplicate        :: I -> A -> Stream A---- * Basic interface-cons            = Stream.cons-snoc            = Stream.snoc-append          = Stream.append-head            = Stream.head-last            = Stream.last-tail            = Stream.tail-init            = Stream.init-null            = Stream.null-length          = Stream.length----- * List transformations-map             = Stream.map---reverse       = Stream.reverse-intersperse     = Stream.intersperse---intercalate   = Stream.intercalate---transpose     = Stream.transpose---- * Reducing lists (folds)-foldl           = Stream.foldl-foldl'          = Stream.foldl'-foldl1          = Stream.foldl1-foldl1'         = Stream.foldl1'-foldr           = Stream.foldr-foldr1          = Stream.foldr1---- ** Special folds--- concat          = Stream.concat-concatMap       = Stream.concatMap-and             = Stream.and-or              = Stream.or-any             = Stream.any-all             = Stream.all-sum             = Stream.sum-product         = Stream.product-maximum         = Stream.maximum-minimum         = Stream.minimum---- * Building lists--- ** Scans-scanl           = \f z xs -> Stream.scanl f z (Stream.snoc xs bottom)-  where-     bottom :: a-     bottom = error "bottom"--scanl1          = \f xs    -> Stream.scanl1 f (Stream.snoc xs bottom)-  where-     bottom :: a-     bottom = error "bottom"--{--scanr           = Stream.scanr-scanr1          = Stream.scanr1---- ** Accumulating maps-mapAccumL       = Stream.mapAccumL-mapAccumR       = Stream.mapAccumR--}--- ** Infinite lists-iterate         = Stream.iterate-repeat          = Stream.repeat-replicate       = Stream.replicate-cycle           = Stream.cycle---- ** Unfolding-unfoldr         = Stream.unfoldr---- * Sublists--- ** Extracting sublists-take            = Stream.take-drop            = Stream.drop-splitAt         = Stream.splitAt-takeWhile       = Stream.takeWhile-dropWhile       = Stream.dropWhile-{--span          = Stream.span-break           = Stream.break-group           = Stream.group-inits           = Stream.inits-tails           = Stream.tails--}---- * Predicates-isPrefixOf      = Stream.isPrefixOf-{--isSuffixOf      = Stream.isSuffixOf-isInfixOf       = Stream.isInfixOf--}--- * Searching lists--- ** Searching by equality-elem            = Stream.elem---notElem       = Stream.notElem-lookup          = Stream.lookup---- ** Searching with a predicate-find            = Stream.find-filter          = Stream.filter---partition     = Stream.partition---- * Indexing lists-(!!)            = Stream.index-findIndex       = Stream.findIndex-elemIndex       = Stream.elemIndex-elemIndices     = Stream.elemIndices-findIndices     = Stream.findIndices---- * Zipping and unzipping lists-zip             = Stream.zip-zip3            = Stream.zip3---zip4            = Stream.zip4---zip5            = Stream.zip5---zip6            = Stream.zip6---zip7            = Stream.zip7-zipWith         = Stream.zipWith-zipWith3        = Stream.zipWith3---zipWith4        = Stream.zipWith4---zipWith5        = Stream.zipWith5---zipWith6        = Stream.zipWith6---zipWith7        = Stream.zipWith7-unzip           = Stream.unzip---unzip3          = Stream.unzip3---unzip4          = Stream.unzip4---unzip5          = Stream.unzip5---unzip6          = Stream.unzip6---unzip7          = Stream.unzip7---- * Special lists--- ** Functions on strings--{--lines           = Stream.lines-words           = Stream.words-unlines         = Stream.unlines-unwords         = Stream.unwords---- ** \"Set\" operations-nub             = Stream.nub-delete          = Stream.delete-(\\)            = (Stream.\\)-union           = Stream.union-intersect       = Stream.intersect---- ** Ordered lists -sort            = Stream.sort-insert          = Stream.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Stream.nubBy-deleteBy        = Stream.deleteBy-deleteFirstsBy  = Stream.deleteFirstsBy-unionBy         = Stream.unionBy-intersectBy     = Stream.intersectBy-groupBy         = Stream.groupBy--}---- *** User-supplied comparison (replacing an Ord context)-insertBy        = Stream.insertBy-{--sortBy          = Stream.sortBy--}--maximumBy       = Stream.maximumBy-minimumBy       = Stream.minimumBy---- * The \"generic\" operations-genericLength           = Stream.genericLength-genericTake             = Stream.genericTake-genericDrop             = Stream.genericDrop-genericIndex            = Stream.genericIndex-genericSplitAt          = Stream.genericSplitAt---genericReplicate        = Stream.genericReplicate
− tests/Properties/Monomorphic/StreamList.hs
@@ -1,385 +0,0 @@------ list like wrappers for abstract streams------ These specify the versions used when fusion occurs.------ So we can check our stream implementations, which are only used when--- fusion happens, are correct.-----module Properties.Monomorphic.StreamList where--import Prelude-import qualified Prelude -import Properties.Utils--import qualified Data.Stream as Stream---- * Basic interface-cons            :: A -> [A] -> [A]-snoc            :: [A] -> A -> [A]-append          :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int----- * List transformations-map             :: (A -> B) -> [A] -> [B]---reverse       :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate   :: [A] -> [[A]] -> [A]---transpose     :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds---concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]--{--scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])--}---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]--{--span          :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]--}---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-{--isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool--}---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool---notElem               :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]---partition     :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-{--zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]--}--zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-{--zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]--}--unzip           :: [(A, B)] -> ([A], [B])-{--unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])--}---- * Special lists--- ** Functions on strings-unlines         :: [String] -> String--- lines           :: String -> [String]-{--words           :: String -> [String]-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]--}---- *** User-supplied comparison (replacing an Ord context)-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-{--sortBy          :: (A -> A -> Ordering) -> [A] -> [A]--}-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericIndex            :: [A] -> I -> A-genericSplitAt          :: I -> [A] -> ([A], [A])-genericReplicate        :: I -> A -> [A]--s = Stream.stream-u = Stream.unstream---- * Basic interface-cons            = \x xs  -> u $ Stream.cons   x (s xs)-snoc            = \xs x  -> u $ Stream.snoc   (s xs) x-append          = \xs ys -> u $ Stream.append (s xs) (s ys)-head            = \xs    ->     Stream.head   (s xs)-last            = \xs    ->     Stream.last   (s xs)-tail            = \xs    -> u $ Stream.tail   (s xs)-init            = \xs    -> u $ Stream.init   (s xs)-null            = \xs    ->     Stream.null   (s xs)-length          = \xs    ->     Stream.length (s xs)----- * List transformations-map             = \f   xs -> u $ Stream.map f (s xs)---reverse               = Stream.reverse-intersperse     = \sep xs -> u $ Stream.intersperse sep (s xs)-intercalate     = \sep xs -> u $ Stream.concatMap s (Stream.intersperse sep(s xs))----transpose     = Stream.transpose---- * Reducing lists (folds)-foldl           = \f z xs -> Stream.foldl   f z (s xs)-foldl'          = \f z xs -> Stream.foldl'  f z (s xs)-foldl1          = \f   xs -> Stream.foldl1  f   (s xs)-foldl1'         = \f   xs -> Stream.foldl1' f   (s xs)-foldr           = \f z xs -> Stream.foldr   f z (s xs)-foldr1          = \f   xs -> Stream.foldr1  f   (s xs)---- ** Special folds--- concat          = \  xs -> Stream.concat xs-concatMap       = \f xs -> u $ Stream.concatMap (s . f) (s xs)-and             = \  xs -> Stream.and   (s xs)-or              = \  xs -> Stream.or    (s xs)-any             = \f xs -> Stream.any f (s xs)-all             = \f xs -> Stream.all f (s xs)-sum             = \  xs -> Stream.sum   (s xs)-product         = \  xs -> Stream.product   (s xs)-maximum         = \  xs -> Stream.maximum   (s xs)-minimum         = \  xs -> Stream.minimum   (s xs)---- * Building lists--- ** Scans-scanl           = \f z xs -> u (Stream.scanl f z (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--scanl1          = \f xs -> u (Stream.scanl1 f (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--{--scanr           = \f z xs -> u (Stream.scanr f z (Stream.cons bottom (s xs)))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--}--{--scanr1          = Stream.scanr1---- ** Accumulating maps-mapAccumL       = Stream.mapAccumL-mapAccumR       = Stream.mapAccumR--}--- ** Infinite lists-iterate         = \f x -> u $ Stream.iterate   f x-repeat          = \  x -> u $ Stream.repeat      x-replicate       = \n x -> u $ Stream.replicate n x-cycle           = \ xs -> u $ Stream.cycle    (s xs)---- ** Unfolding-unfoldr         = \f x -> u $ Stream.unfoldr f x---- * Sublists--- ** Extracting sublists-take            = \n xs -> u $ Stream.take    n (s xs)-drop            = \n xs -> u $ Stream.drop    n (s xs)-splitAt         = \n xs ->     Stream.splitAt n (s xs)-takeWhile       = \f xs -> u $ Stream.takeWhile f (s xs)-dropWhile       = \f xs -> u $ Stream.dropWhile f (s xs)-{--span          = Stream.span-break           = Stream.break-group           = Stream.group-inits           = Stream.inits-tails           = Stream.tails--}---- * Predicates-isPrefixOf      = \xs ys -> Stream.isPrefixOf (s xs) (s ys)-{--isSuffixOf      = Stream.isSuffixOf-isInfixOf       = Stream.isInfixOf--}--- * Searching lists--- ** Searching by equality-elem            = \key xs -> Stream.elem   key (s xs)---notElem               = Stream.notElem-lookup          = \key xs -> Stream.lookup key (s xs)---- ** Searching with a predicate-find            = \p xs ->     Stream.find   p (s xs)-filter          = \p xs -> u $ Stream.filter p (s xs)---partition     = Stream.partition---- * Indexing lists-(!!)            = \xs -> Stream.index (s xs)-findIndex       = \f xs -> Stream.findIndex f (s xs)-elemIndex       = \x xs -> Stream.elemIndex x (s xs)-elemIndices     = \x xs -> u (Stream.elemIndices x (s xs))-findIndices     = \p xs -> u (Stream.findIndices p (s xs))----- * Zipping and unzipping lists-zip  = \xs ys    -> u (Stream.zip (s xs) (s ys))-zip3 = \xs ys zs -> u (Stream.zip3 (s xs) (s ys) (s zs))--zipWith         = \f xs ys    -> u (Stream.zipWith f (s xs) (s ys))-zipWith3        = \f xs ys zs -> u (Stream.zipWith3 f (s xs) (s ys) (s zs))--unzip           = Stream.unzip . s--{--zip4            = Stream.zip4-zip5            = Stream.zip5-zip6            = Stream.zip6-zip7            = Stream.zip7-zipWith4        = Stream.zipWith4-zipWith5        = Stream.zipWith5-zipWith6        = Stream.zipWith6-zipWith7        = Stream.zipWith7-unzip3          = Stream.unzip3-unzip4          = Stream.unzip4-unzip5          = Stream.unzip5-unzip6          = Stream.unzip6-unzip7          = Stream.unzip7--}---- * Special lists--- ** Functions on strings-unlines         = \xs -> u (Stream.concatMap (\x -> Stream.snoc (s x) '\n') (s xs))--- lines           = \xs -> u (Stream.lines (s xs))--{--words           = Stream.words-unwords         = Stream.unwords---- ** \"Set\" operations-nub             = Stream.nub-delete          = Stream.delete-(\\)            = (Stream.\\)-union           = Stream.union-intersect       = Stream.intersect---- ** Ordered lists -sort            = Stream.sort-insert          = Stream.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Stream.nubBy-deleteBy        = Stream.deleteBy-deleteFirstsBy  = Stream.deleteFirstsBy-unionBy         = Stream.unionBy-intersectBy     = Stream.intersectBy-groupBy         = Stream.groupBy--}---- *** User-supplied comparison (replacing an Ord context)-{--sortBy          = Stream.sortBy--}-insertBy        = \cmp x xs -> u $ Stream.insertBy cmp x (s xs)--maximumBy       = \cmp xs -> Stream.maximumBy cmp (s xs)-minimumBy       = \cmp xs -> Stream.minimumBy cmp (s xs)---- * The \"generic\" operations-genericLength           = \xs -> Stream.genericLength (s xs)-genericTake             = \n xs -> u $ Stream.genericTake n (s xs)-genericDrop             = \n xs -> u $ Stream.genericDrop n (s xs)-genericIndex            = \xs n -> Stream.genericIndex (s xs) n-genericSplitAt          = \n xs -> Stream.genericSplitAt n (s xs)-genericReplicate        = \n x  -> genericTake n (Prelude.repeat x)-
− tests/Properties/StreamListVsBase.hs
@@ -1,459 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import System.IO-import Properties.Utils--import qualified Properties.Monomorphic.StreamList  as Test         -- stream functions-import qualified Properties.Monomorphic.Base        as Spec         -- Data.List------- Data.Stream <=> Data.List-------------------------------------------------------------------------------- * Basic interface--prop_cons       = Test.cons     `eq2`           (:)-prop_snoc       = Test.snoc     `eq2`           (\xs x -> xs Spec.++ [x])-prop_append     = Test.append   `eq2`           (Spec.++)-prop_head       = Test.head     `eqnotnull1`    Spec.head-prop_last       = Test.last     `eqnotnull1`    Spec.last-prop_tail       = Test.tail     `eqnotnull1`    Spec.tail-prop_init       = Test.init     `eqnotnull1`    Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map--- prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate--- prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'--prop_foldl1     = Test.foldl1   `eqnotnull2`    Spec.foldl1 -- n.b.-prop_foldl1'    = Test.foldl1'  `eqnotnull2`    Spec.foldl1' -- n.b.--prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1   `eqnotnull2`    Spec.foldr1----------------------------------------------------------------------------- ** Special folds---- prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum  `eqnotnull1`    Spec.maximum-prop_minimum    = Test.minimum  `eqnotnull1`    Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1--- prop_scanr      = Test.scanr            `eq3`   Spec.scanr--{--prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1--}----------------------------------------------------------------------------- ** Accumulating maps--{--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR--}----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate          `eqfinite2`     Spec.iterate-prop_repeat     = Test.repeat           `eqfinite1`     Spec.repeat-prop_replicate  = Test.replicate        `eq2`           Spec.replicate-prop_cycle      = \x -> not (null x) ==>-                  (Test.cycle           `eqfinite1`     Spec.cycle) x----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr          `eqfinite2`     Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile--{--prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails--}----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-{--prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf--}----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem--- prop_notElem    = Test.notElem          `eq2`   Spec.notElem -- no specific implementation-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter--- prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = \xs n -> n >= 0 && n < length xs ==>-                          ((Test.!!)            `eq2`   (Spec.!!)) xs n-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3--prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3--{--prop_zip4       = Test.zip4             `eq4`   Spec.zip4-prop_zip5       = Test.zip5             `eq5`   Spec.zip5-prop_zip6       = Test.zip6             `eq6`   Spec.zip6-prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7--}----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip--{--prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3-prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4-prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5-prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6-prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7--}----------------------------------------------------------------------------- * Special lists--- ** Functions on strings-prop_unlines    = Test.unlines          `eq1`   Spec.unlines--- prop_lines      = Test.lines            `eq1`   Spec.lines--{--prop_words      = Test.words            `eq1`   Spec.words-prop_unwords    = Test.unwords          `eq1`   Spec.unwords--}----------------------------------------------------------------------------- ** \"Set\" operations--{--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect--}----------------------------------------------------------------------------- ** Ordered lists --{--prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert--}----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--{--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy--}----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--{--prop_sortBy             = Test.sortBy           `eq2`           Spec.sortBy--}-prop_insertBy           = Test.insertBy         `eq3`           Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eqnotnull2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eqnotnull2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`   Spec.genericLength-prop_genericTake        = \i -> i >= I 0 ==>-                          (Test.genericTake     `eq2`   Spec.genericTake) i-prop_genericDrop        = \i -> i >= I 0 ==>-                          (Test.genericDrop     `eq2`   Spec.genericDrop) i-prop_genericIndex       = \xs i -> i >= I 0 && i < Spec.genericLength xs ==>-                          (Test.genericIndex    `eq2`   Spec.genericIndex) xs i-prop_genericSplitAt     = \i -> i >= I 0 ==>-                          (Test.genericSplitAt  `eq2`   Spec.genericSplitAt) i-prop_genericReplicate   = \i -> i >= I 0 ==>-                          (Test.genericReplicate        `eq2`   Spec.genericReplicate) i----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing: Data.Stream <=> Data.List"-  putStrLn "==================================\n"--  runTests "Basic interface" opts-    [run prop_cons-    ,run prop_snoc-    ,run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map---  ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate---  ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldr--    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [---   run prop_concat,-     run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-{--    ,run prop_scanr-    ,run prop_scanr1--}-    ]--{--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--}--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile--{--    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails--}-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-{--    ,run prop_isSuffixOf-    ,run prop_isInfixOf--}-    ]--  runTests "Searching by equality" opts-    [run prop_elem---  ,run prop_notElem-- no specific implementation-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter---  ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_findIndex-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndices-    ]--  runTests "Zipping" opts-    [-     run prop_zip-    ,run prop_zip3-{--    ,run prop_zip4-    ,run prop_zip5-    ,run prop_zip6-    ,run prop_zip7--}-    ,run prop_zipWith-    ,run prop_zipWith3-{--    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7--}-    ]--  runTests "Unzipping" opts-    [run prop_unzip-{--    ,run prop_unzip3-    ,run prop_unzip4-    ,run prop_unzip5-    ,run prop_unzip6-    ,run prop_unzip7--}-    ]--  runTests "Functions on strings" opts-    [run prop_unlines-{--    ,run prop_lines-    ,run prop_words-    ,run prop_unwords--}-    ]--{--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--}--{--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--}--{--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--}--  runTests "Ord style \"By\" operations" opts-{--     run prop_sortBy        -- note issue here.--}-    [run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericIndex-    ,run prop_genericSplitAt-    ,run prop_genericReplicate-    ]
− tests/Properties/StreamListVsSpec.hs
@@ -1,463 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import System.IO-import Properties.Utils--import qualified Properties.Monomorphic.StreamList  as Test         -- stream functions-import qualified Properties.Monomorphic.Spec        as Spec         -- H98------- Data.Stream <=> Spec.List-------------------------------------------------------------------------------- * Basic interface--prop_cons       = Test.cons     `eq2`           (:)-prop_snoc       = Test.snoc     `eq2`           (\xs x -> xs Spec.++ [x])-prop_append     = Test.append   `eq2`           (Spec.++)-prop_head       = Test.head     `eqnotnull1`    Spec.head-prop_last       = Test.last     `eqnotnull1`    Spec.last-prop_tail       = Test.tail     `eqnotnull1`    Spec.tail-prop_init       = Test.init     `eqnotnull1`    Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map--- prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate--- prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'--prop_foldl1     = Test.foldl1   `eqnotnull2`    Spec.foldl1 -- n.b.-prop_foldl1'    = Test.foldl1'  `eqnotnull2`    Spec.foldl1' -- n.b.--prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1   `eqnotnull2`    Spec.foldr1----------------------------------------------------------------------------- ** Special folds---- prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum  `eqnotnull1`    Spec.maximum-prop_minimum    = Test.minimum  `eqnotnull1`    Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1--- prop_scanr      = Test.scanr            `eq3`   Spec.scanr--{--prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1--}----------------------------------------------------------------------------- ** Accumulating maps--{--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR--}----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate          `eqfinite2`     Spec.iterate-prop_repeat     = Test.repeat           `eqfinite1`     Spec.repeat-prop_replicate  = Test.replicate        `eq2`           Spec.replicate-prop_cycle      = \x -> not (null x) ==>-                  (Test.cycle           `eqfinite1`     Spec.cycle) x----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr          `eqfinite2`     Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile--{--prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails--}----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-{--prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf--}----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem--- prop_notElem    = Test.notElem          `eq2`   Spec.notElem -- no specific implementation-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter--- prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = \xs n -> n >= 0 && n < length xs ==>-                          ((Test.!!)            `eq2`   (Spec.!!)) xs n-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3--prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3--{--prop_zip4       = Test.zip4             `eq4`   Spec.zip4-prop_zip5       = Test.zip5             `eq5`   Spec.zip5-prop_zip6       = Test.zip6             `eq6`   Spec.zip6-prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7--}----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip--{--prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3-prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4-prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5-prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6-prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7--}----------------------------------------------------------------------------- * Special lists--- ** Functions on strings-prop_unlines    = Test.unlines          `eq1`   Spec.unlines--- prop_lines      = Test.lines            `eq1`   Spec.lines--{--prop_words      = Test.words            `eq1`   Spec.words-prop_unwords    = Test.unwords          `eq1`   Spec.unwords--}----------------------------------------------------------------------------- ** \"Set\" operations--{--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect--}----------------------------------------------------------------------------- ** Ordered lists --{--prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert--}----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--{--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy--}----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--{--prop_sortBy             = Test.sortBy           `eq2`           Spec.sortBy--}-prop_insertBy           = Test.insertBy         `eq3`           Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eqnotnull2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eqnotnull2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`   Spec.genericLength-prop_genericTake        = \i -> i >= I 0 ==>-                          (Test.genericTake     `eq2`   Spec.genericTake) i-prop_genericDrop        = \i -> i >= I 0 ==>-                          (Test.genericDrop     `eq2`   Spec.genericDrop) i-prop_genericIndex       = \xs i -> i >= I 0 && i < Spec.genericLength xs ==>-                          (Test.genericIndex    `eq2`   Spec.genericIndex) xs i-prop_genericSplitAt     = \i -> i >= I 0 ==>-                          (Test.genericSplitAt  `eq2`   Spec.genericSplitAt) i-prop_genericReplicate   = \i -> i >= I 0 ==>-                          (Test.genericReplicate        `eq2`   Spec.genericReplicate) i----------------------------------------------------------------------------{-# RULES-"main/error" main = error "RULES are on!"-  #-}--main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing: Data.Stream <=> Spec.List"-  putStrLn "==================================\n"--  runTests "Basic interface" opts-    [run prop_cons-    ,run prop_snoc-    ,run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map---  ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate---  ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldr--    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [---   run prop_concat,-     run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-{--    ,run prop_scanr-    ,run prop_scanr1--}-    ]--{--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--}--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile--{--    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails--}-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-{--    ,run prop_isSuffixOf-    ,run prop_isInfixOf--}-    ]--  runTests "Searching by equality" opts-    [run prop_elem---  ,run prop_notElem-- no specific implementation-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter---  ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_findIndex-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndices-    ]--  runTests "Zipping" opts-    [-     run prop_zip-    ,run prop_zip3-{--    ,run prop_zip4-    ,run prop_zip5-    ,run prop_zip6-    ,run prop_zip7--}-    ,run prop_zipWith-    ,run prop_zipWith3-{--    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7--}-    ]--  runTests "Unzipping" opts-    [run prop_unzip-{--    ,run prop_unzip3-    ,run prop_unzip4-    ,run prop_unzip5-    ,run prop_unzip6-    ,run prop_unzip7--}-    ]--  runTests "Functions on strings" opts-    [run prop_unlines-{--    ,run prop_lines-    ,run prop_words-    ,run prop_unwords--}-    ]--{--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--}--{--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--}--{--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--}--  runTests "Ord style \"By\" operations" opts-{--     run prop_sortBy        -- note issue here.--}-    [run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericIndex-    ,run prop_genericSplitAt-    ,run prop_genericReplicate-    ]
− tests/Properties/StreamVsSpecStream.hs
@@ -1,475 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import System.IO-import Properties.Utils hiding (eqnotnull1, eqnotnull2, eqnotnull3-                               ,eqfinite1, eqfinite2, eqfinite1)--import qualified Properties.Monomorphic.Stream      as Test         -- stream functions-import qualified Properties.Monomorphic.SpecStream  as Spec         -- H98--import qualified Data.Stream as Stream (Stream(Stream), Step(..), null, take, length)------- Data.Stream <=> Spec.List-------------------------------------------------------------------------------- * Basic interface--prop_cons       = Test.cons     `eq2`           Spec.cons-prop_snoc       = Test.snoc     `eq2`           Spec.snoc-prop_append     = Test.append   `eq2`           (Spec.++)-prop_head       = Test.head     `eqnotnull1`    Spec.head-prop_last       = Test.last     `eqnotnull1`    Spec.last-prop_tail       = Test.tail     `eqnotnull1`    Spec.tail-prop_init       = Test.init     `eqnotnull1`    Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map--- prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse--- prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate--- prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'--prop_foldl1     = Test.foldl1   `eqnotnull2`    Spec.foldl1 -- n.b.-prop_foldl1'    = Test.foldl1'  `eqnotnull2`    Spec.foldl1' -- n.b.--prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1   `eqnotnull2`    Spec.foldr1----------------------------------------------------------------------------- ** Special folds---- prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum  `eqnotnull1`    Spec.maximum-prop_minimum    = Test.minimum  `eqnotnull1`    Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1--{--prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr--}----------------------------------------------------------------------------- ** Accumulating maps--{--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR--}----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate          `eqfinite2`     Spec.iterate-prop_repeat     = Test.repeat           `eqfinite1`     Spec.repeat-prop_replicate  = Test.replicate        `eq2`           Spec.replicate-prop_cycle      = \x -> not (Stream.null x) ==>-                  (Test.cycle           `eqfinite1`     Spec.cycle) x----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr          `eqfinite2`     Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile--{--prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails--}----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-{--prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf--}----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem--- prop_notElem    = Test.notElem          `eq2`   Spec.notElem -- no specific implementation-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter--- prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = \xs n -> n >= 0 && n < Stream.length xs ==>-                          ((Test.!!)            `eq2`   (Spec.!!)) xs n-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3--prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3--{--prop_zip4       = Test.zip4             `eq4`   Spec.zip4-prop_zip5       = Test.zip5             `eq5`   Spec.zip5-prop_zip6       = Test.zip6             `eq6`   Spec.zip6-prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7--}----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip--{--prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3-prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4-prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5-prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6-prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7--}----------------------------------------------------------------------------- * Special lists--- ** Functions on strings---- hmm?-{--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords          `eq1`   Spec.unwords--}----------------------------------------------------------------------------- ** \"Set\" operations--{--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect--}----------------------------------------------------------------------------- ** Ordered lists --{--prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert--}----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--{--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy--}----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--{--prop_sortBy             = Test.sortBy           `eq2`           Spec.sortBy-prop_insertBy           = Test.insertBy         `eq3`           Spec.insertBy--}-prop_maximumBy          = Test.maximumBy        `eqnotnull2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eqnotnull2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`   Spec.genericLength-prop_genericTake        = \i -> i >= I 0 ==>-                          (Test.genericTake     `eq2`   Spec.genericTake) i-prop_genericDrop        = \i -> i >= I 0 ==>-                          (Test.genericDrop     `eq2`   Spec.genericDrop) i-prop_genericIndex       = \xs i -> i >= I 0 && i < Spec.genericLength xs ==>-                          (Test.genericIndex    `eq2`   Spec.genericIndex) xs i-prop_genericSplitAt     = \i -> i >= I 0 ==>-                          (Test.genericSplitAt  `eq2`   Spec.genericSplitAt) i---prop_genericReplicate   = \i -> i >= I 0 ==>---                          (Test.genericReplicate        `eq2`   Spec.genericReplicate) i----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing: Data.Stream <=> Spec.List"-  putStrLn "==================================\n"--  runTests "Basic interface" opts-    [run prop_cons-    ,run prop_snoc-    ,run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map---  ,run prop_reverse-    ,run prop_intersperse---  ,run prop_intercalate---  ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldr--    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [---   run prop_concat,-     run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-{----  ,run prop_scanr-    ,run prop_scanr1--}-    ]--{--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--}--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile--{--    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails--}-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-{--    ,run prop_isSuffixOf-    ,run prop_isInfixOf--}-    ]--  runTests "Searching by equality" opts-    [run prop_elem---  ,run prop_notElem-- no specific implementation-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter---  ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_findIndex-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndices-    ]--  runTests "Zipping" opts-    [-     run prop_zip-    ,run prop_zip3-{--    ,run prop_zip4-    ,run prop_zip5-    ,run prop_zip6-    ,run prop_zip7--}-    ,run prop_zipWith-    ,run prop_zipWith3-{--    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7--}-    ]--  runTests "Unzipping" opts-    [run prop_unzip-{--    ,run prop_unzip3-    ,run prop_unzip4-    ,run prop_unzip5-    ,run prop_unzip6-    ,run prop_unzip7--}-    ]--  runTests "Functions on strings" opts-    [-{-   -     run prop_unlines-    ,run prop_lines-    ,run prop_words-    ,run prop_unwords--}-    ]--{--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--}--{--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--}--{--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--}--  runTests "Ord style \"By\" operations" opts-    [-{--     run prop_sortBy        -- note issue here.-    ,run prop_insertBy--}-     run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericIndex-    ,run prop_genericSplitAt---  ,run prop_genericReplicate-    ]----------------------------------------------------------------------------eqnotnull1 f g = \x     -> (not (Stream.null x)) ==> eq1 f g x-eqnotnull2 f g = \x y   -> (not (Stream.null y)) ==> eq2 f g x y-eqnotnull3 f g = \x y z -> (not (Stream.null z)) ==> eq3 f g x y z--eqfinite1 f g = \x     -> forAll arbitrary $ \n -> Stream.take n (f x)     == Stream.take n (g x)-eqfinite2 f g = \x y   -> forAll arbitrary $ \n -> Stream.take n (f x y)   == Stream.take n (g x y)-eqfinite3 f g = \x y z -> forAll arbitrary $ \n -> Stream.take n (f x y z) == Stream.take n (g x y z)
− tests/Properties/Utils.hs
@@ -1,162 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts #-}--module Properties.Utils (-  module Properties.Utils,-  module Test.QuickCheck,-  module Test.QuickCheck.Batch,-  ) where--import Test.QuickCheck-import Test.QuickCheck.Batch-import Text.Show.Functions--import Control.Monad (liftM,liftM5)--import qualified Data.Stream as S--opts = TestOptions {-         no_of_tests     = 200,-         length_of_tests = 0,-         debug_tests = False-       }--eq1 :: (Eq a) => (t -> a) -> (t -> a) -> t -> Property-eq2 :: (Eq a) => (t -> t1 -> a) -> (t -> t1 -> a) -> t -> t1 -> Property-eq3 :: (Eq a) => (t -> t1 -> t2 -> a)-    -> (t -> t1 -> t2 -> a)-    -> t -> t1 -> t2 -> Property-eq4 :: (Eq a) => (t -> t1 -> t2 -> t3 -> a)-    -> (t -> t1 -> t2 -> t3 -> a)-    -> t -> t1 -> t2 -> t3 -> Property-eq5 :: (Eq a) => (t -> t1 -> t2 -> t3 -> t4 -> a)-    -> (t -> t1 -> t2 -> t3 -> t4 -> a)-    -> t -> t1 -> t2 -> t3 -> t4 -> Property-eq6 :: (Eq a) => (t -> t1 -> t2 -> t3 -> t4 -> t5 -> a)-    -> (t -> t1 -> t2 -> t3 -> t4 -> t5 -> a)-    -> t -> t1 -> t2 -> t3 -> t4 -> t5 -> Property-eq7 :: (Eq a) => (t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> a)-    -> (t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> a)-    -> t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> Property-eq8 :: (Eq a) => (t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> t7 -> a)-    -> (t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> t7 -> a)-    -> t -> t1 -> t2 -> t3 -> t4 -> t5 -> t6 -> t7 -> Property--eq1 f g = \x               -> property $ f x               == g x-eq2 f g = \x y             -> property $ f x y             == g x y-eq3 f g = \x y z           -> property $ f x y z           == g x y z-eq4 f g = \x y z a         -> property $ f x y z a         == g x y z a-eq5 f g = \x y z a b       -> property $ f x y z a b       == g x y z a b-eq6 f g = \x y z a b c     -> property $ f x y z a b c     == g x y z a b c-eq7 f g = \x y z a b c d   -> property $ f x y z a b c d   == g x y z a b c d-eq8 f g = \x y z a b c d e -> property $ f x y z a b c d e == g x y z a b c d e--eqnotnull1 :: (Eq a1) => ([a] -> a1) -> ([a] -> a1) -> [a] -> Property-eqnotnull2 :: (Eq a1) => (t -> [a] -> a1)-           -> (t -> [a] -> a1) -> t -> [a] -> Property-eqnotnull3 :: (Eq a1) => (t -> t1 -> [a] -> a1)-           -> (t -> t1 -> [a] -> a1) -> t -> t1 -> [a] -> Property--eqnotnull1 f g = \x     -> (not (null x)) ==> eq1 f g x-eqnotnull2 f g = \x y   -> (not (null y)) ==> eq2 f g x y-eqnotnull3 f g = \x y z -> (not (null z)) ==> eq3 f g x y z--eqfinite1 f g = \x     -> forAll arbitrary $ \n -> Prelude.take n (f x)     == Prelude.take n (g x)-eqfinite2 f g = \x y   -> forAll arbitrary $ \n -> Prelude.take n (f x y)   == Prelude.take n (g x y)-eqfinite3 f g = \x y z -> forAll arbitrary $ \n -> Prelude.take n (f x y z) == Prelude.take n (g x y z)---newtype A = A Int deriving (Eq, Show, Arbitrary)-newtype B = B Int deriving (Eq, Show, Arbitrary)-newtype C = C Int deriving (Eq, Show, Arbitrary)-type D = A-type E = B-type F = C-type G = A-type H = B--newtype OrdA = OrdA Int deriving (Eq, Ord, Show, Arbitrary)--newtype N = N Int deriving (Eq, Ord, Num, Show, Arbitrary)-newtype I = I Int deriving (Eq, Ord, Num, Enum, Real, Integral, Show, Arbitrary)--instance Arbitrary Char where-    arbitrary     = elements ([' ', '\n', '\0'] ++ ['a'..'h'])-    coarbitrary c = variant (fromEnum c `rem` 4)--instance Arbitrary Ordering where-    arbitrary      = elements [LT, EQ, GT]-    coarbitrary LT = variant 0-    coarbitrary EQ = variant 1-    coarbitrary GT = variant 2--{--instance Arbitrary a => Arbitrary (Maybe a) where-    arbitrary            = frequency [ (1, return Nothing)-                                     , (3, liftM Just arbitrary) ]-    coarbitrary Nothing  = variant 0-    coarbitrary (Just a) = variant 1 . coarbitrary a-        -}--instance (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d, Arbitrary e)-      => Arbitrary (a, b, c, d ,e )- where-  arbitrary = liftM5 (,,,,) arbitrary arbitrary arbitrary arbitrary arbitrary-  coarbitrary (a, b, c, d, e) =-    coarbitrary a . coarbitrary b . coarbitrary c . coarbitrary d .  coarbitrary e--instance (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d, Arbitrary e, Arbitrary f)-      => Arbitrary (a, b, c, d, e, f)- where-  arbitrary = liftM6 (,,,,,) arbitrary arbitrary arbitrary arbitrary arbitrary arbitrary-  coarbitrary (a, b, c, d, e, f) =-    coarbitrary a . coarbitrary b . coarbitrary c . coarbitrary d .  coarbitrary e . coarbitrary f--liftM6  :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m r-liftM6 f m1 m2 m3 m4 m5 m6 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; return (f x1 x2 x3 x4 x5 x6) }--instance (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d, Arbitrary e, Arbitrary f, Arbitrary g)-      => Arbitrary (a, b, c, d, e, f, g)- where-  arbitrary = liftM7 (,,,,,,) arbitrary arbitrary arbitrary arbitrary arbitrary arbitrary arbitrary-  coarbitrary (a, b, c, d, e, f, g) =-    coarbitrary a . coarbitrary b . coarbitrary c . coarbitrary d .  coarbitrary e . coarbitrary f . coarbitrary g--liftM7  :: (Monad m) => (a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> r) -> m a1 -> m a2 -> m a3 -> m a4 -> m a5 -> m a6 -> m a7 -> m r-liftM7 f m1 m2 m3 m4 m5 m6 m7 = do { x1 <- m1; x2 <- m2; x3 <- m3; x4 <- m4; x5 <- m5; x6 <- m6; x7 <- m7 ; return (f x1 x2 x3 x4 x5 x6 x7) }------------------------------------------------------------------------------ Arbitrary instance for Stream--{--instance (Arbitrary a, Arbitrary s) => Arbitrary (S.Step a s)  where-    arbitrary = do x <- arbitrary-                   a <- arbitrary-                   s <- arbitrary-                   return $ case x of-                        LT -> S.Yield a s-                        EQ -> S.Skip s-                        GT -> S.Done-    coarbitrary = error "No coarbitrary for Step a s"--}---- existential state type-instance (Arbitrary a) => Arbitrary (S.Stream a)  where-    coarbitrary = error "No coarbitrary for Streams"-    arbitrary = do xs    <- arbitrary :: Gen [a]-                   skips <- arbitrary :: Gen [Bool] -- random Skips-                   return (stream' (zip xs skips))-      where-        -- | Construct an abstract stream from a list, with Steps in it.-        stream' :: [(a,Bool)] -> S.Stream a-        stream' xs0 = S.Stream next (S.L xs0)-          where-            next (S.L [])             = S.Done-            next (S.L ((x,True ):xs)) = S.Yield x (S.L xs)-            next (S.L ((_,False):xs)) = S.Skip    (S.L xs)--instance Show a => Show (S.Stream a) where-  show = show . S.unstream--instance Eq a => Eq (S.Stream a) where-  xs == ys = S.unstream xs == S.unstream ys
− tests/Spec/List.hs
@@ -1,289 +0,0 @@--- Taken from the Haskell 98 Report:--- http://haskell.org/onlinereport/---- Modifications to make it compile:---   changed module name---   limited import list from the real Prelude---   copied listToMaybe from the Maybe module--module Spec.List (-    elemIndex, elemIndices,-    find, findIndex, findIndices,-    nub, nubBy, delete, deleteBy, (\\), deleteFirstsBy,-    union, unionBy, intersect, intersectBy,-    intersperse, transpose, partition, group, groupBy,-    inits, tails, isPrefixOf, isSuffixOf,-    mapAccumL, mapAccumR,-    sort, sortBy, insert, insertBy, maximumBy, minimumBy,-    genericLength, genericTake, genericDrop,-    genericSplitAt, genericIndex, genericReplicate,-    zip4, zip5, zip6, zip7,-    zipWith4, zipWith5, zipWith6, zipWith7,-    unzip4, unzip5, unzip6, unzip7, unfoldr,--    -- ...and what the Prelude exports-    -- []((:), []), -- This is built-in syntax-    map, (++), concat, filter,-    head, last, tail, init, null, length, (!!),-    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,-    iterate, repeat, replicate, cycle,-    take, drop, splitAt, takeWhile, dropWhile, span, break,-    lines, words, unlines, unwords, reverse, and, or,-    any, all, elem, notElem, lookup,-    sum, product, maximum, minimum, concatMap, -    zip, zip3, zipWith, zipWith3, unzip, unzip3-    ) where--import Prelude (Int, Integer, Integral, Num(..), Eq(..), Ord(..), Ordering(..),-                Bool(..), (&&), (||), not, Maybe(..), String, -                (.), error, seq, otherwise, flip)-import Spec.PreludeList--infix 5 \\ -- for cpp---- copied from the Maybe module--listToMaybe            :: [a] -> Maybe a-listToMaybe []         =  Nothing-listToMaybe (a:_)      =  Just a----elemIndex               :: Eq a => a -> [a] -> Maybe Int-elemIndex x             =  findIndex (x ==)-        -elemIndices             :: Eq a => a -> [a] -> [Int]-elemIndices x           =  findIndices (x ==)-                        -find                    :: (a -> Bool) -> [a] -> Maybe a-find p                  =  listToMaybe . filter p--findIndex               :: (a -> Bool) -> [a] -> Maybe Int-findIndex p             =  listToMaybe . findIndices p--findIndices             :: (a -> Bool) -> [a] -> [Int]-findIndices p xs        =  [ i | (x,i) <- zip xs [0..], p x ]--nub                     :: Eq a => [a] -> [a]-nub                     =  nubBy (==)--nubBy                   :: (a -> a -> Bool) -> [a] -> [a]-nubBy eq []             =  []-nubBy eq (x:xs)         =  x : nubBy eq (filter (\y -> not (eq x y)) xs)--delete                  :: Eq a => a -> [a] -> [a]-delete                  =  deleteBy (==)--deleteBy                :: (a -> a -> Bool) -> a -> [a] -> [a]-deleteBy eq x []        = []-deleteBy eq x (y:ys)    = if x `eq` y then ys else y : deleteBy eq x ys--(\\)                    :: Eq a => [a] -> [a] -> [a]-(\\)                    =  foldl (flip delete)--deleteFirstsBy          :: (a -> a -> Bool) -> [a] -> [a] -> [a]-deleteFirstsBy eq       =  foldl (flip (deleteBy eq))--union                   :: Eq a => [a] -> [a] -> [a]-union                   =  unionBy (==)    --unionBy                 :: (a -> a -> Bool) -> [a] -> [a] -> [a]-unionBy eq xs ys        =  xs ++ deleteFirstsBy eq (nubBy eq ys) xs--intersect               :: Eq a => [a] -> [a] -> [a]-intersect               =  intersectBy (==)--intersectBy             :: (a -> a -> Bool) -> [a] -> [a] -> [a]-intersectBy eq xs ys    =  [x | x <- xs, any (eq x) ys]--intersperse             :: a -> [a] -> [a]-intersperse sep []      =  []-intersperse sep [x]     =  [x]-intersperse sep (x:xs)  =  x : sep : intersperse sep xs---- transpose is lazy in both rows and columns,---       and works for non-rectangular 'matrices'--- For example, transpose [[1,2],[3,4,5],[]]  =  [[1,3],[2,4],[5]]--- Note that [h | (h:t) <- xss] is not the same as (map head xss)---      because the former discards empty sublists inside xss-transpose                :: [[a]] -> [[a]]-transpose []             = []-transpose ([]     : xss) = transpose xss-transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : -                           transpose (xs : [t | (h:t) <- xss])--partition               :: (a -> Bool) -> [a] -> ([a],[a])-partition p xs          =  (filter p xs, filter (not . p) xs)---- group splits its list argument into a list of lists of equal, adjacent--- elements.  e.g.,--- group "Mississippi" == ["M","i","ss","i","ss","i","pp","i"]-group                   :: Eq a => [a] -> [[a]]-group                   =  groupBy (==)--groupBy                 :: (a -> a -> Bool) -> [a] -> [[a]]-groupBy eq []           =  []-groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs-                           where (ys,zs) = span (eq x) xs---- inits xs returns the list of initial segments of xs, shortest first.--- e.g., inits "abc" == ["","a","ab","abc"]-inits                   :: [a] -> [[a]]-inits []                =  [[]]-inits (x:xs)            =  [[]] ++ map (x:) (inits xs)---- tails xs returns the list of all final segments of xs, longest first.--- e.g., tails "abc" == ["abc", "bc", "c",""]-tails                   :: [a] -> [[a]]-tails []                =  [[]]-tails xxs@(_:xs)        =  xxs : tails xs--isPrefixOf               :: Eq a => [a] -> [a] -> Bool-isPrefixOf []     _      =  True-isPrefixOf _      []     =  False-isPrefixOf (x:xs) (y:ys) =  x == y && isPrefixOf xs ys--isSuffixOf              :: Eq a => [a] -> [a] -> Bool-isSuffixOf x y          =  reverse x `isPrefixOf` reverse y--mapAccumL               :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])-mapAccumL f s []        =  (s, [])-mapAccumL f s (x:xs)    =  (s'',y:ys)-                           where (s', y ) = f s x-                                 (s'',ys) = mapAccumL f s' xs--mapAccumR               :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])-mapAccumR f s []        =  (s, [])-mapAccumR f s (x:xs)    =  (s'', y:ys)-                           where (s'',y ) = f s' x-                                 (s', ys) = mapAccumR f s xs--unfoldr                 :: (b -> Maybe (a,b)) -> b -> [a]-unfoldr f b             = case f b of-                                Nothing    -> []-                                Just (a,b) -> a : unfoldr f b--sort                    :: (Ord a) => [a] -> [a]-sort                    =  sortBy compare--sortBy                  :: (a -> a -> Ordering) -> [a] -> [a]-sortBy cmp              =  foldr (insertBy cmp) []--insert                  :: (Ord a) => a -> [a] -> [a]-insert                  = insertBy compare--insertBy                :: (a -> a -> Ordering) -> a -> [a] -> [a]-insertBy cmp x []       =  [x]-insertBy cmp x ys@(y:ys')-                        =  case cmp x y of-                                GT -> y : insertBy cmp x ys'-                                _  -> x : ys--maximumBy               :: (a -> a -> Ordering) -> [a] -> a-maximumBy cmp []        =  error "List.maximumBy: empty list"-maximumBy cmp xs        =  foldl1 max xs-                        where-                           max x y = case cmp x y of-                                        GT -> x-                                        _  -> y--minimumBy               :: (a -> a -> Ordering) -> [a] -> a-minimumBy cmp []        =  error "List.minimumBy: empty list"-minimumBy cmp xs        =  foldl1 min xs-                        where-                           min x y = case cmp x y of-                                        GT -> y-                                        _  -> x--genericLength           :: (Integral a) => [b] -> a-genericLength []        =  0-genericLength (x:xs)    =  1 + genericLength xs--genericTake             :: (Integral a) => a -> [b] -> [b]-genericTake _ []        =  []-genericTake 0 _         =  []-genericTake n (x:xs) -   | n > 0              =  x : genericTake (n-1) xs-   | otherwise          =  error "List.genericTake: negative argument"--genericDrop             :: (Integral a) => a -> [b] -> [b]-genericDrop 0 xs        =  xs-genericDrop _ []        =  []-genericDrop n (_:xs) -   | n > 0              =  genericDrop (n-1) xs-   | otherwise          =  error "List.genericDrop: negative argument"--genericSplitAt          :: (Integral a) => a -> [b] -> ([b],[b])-genericSplitAt 0 xs     =  ([],xs)-genericSplitAt _ []     =  ([],[])-genericSplitAt n (x:xs) -   | n > 0              =  (x:xs',xs'')-   | otherwise          =  error "List.genericSplitAt: negative argument"-       where (xs',xs'') =  genericSplitAt (n-1) xs--genericIndex            :: (Integral a) => [b] -> a -> b-genericIndex (x:_)  0   =  x-genericIndex (_:xs) n -        | n > 0         =  genericIndex xs (n-1)-        | otherwise     =  error "List.genericIndex: negative argument"-genericIndex _ _        =  error "List.genericIndex: index too large"--genericReplicate        :: (Integral a) => a -> b -> [b]-genericReplicate n x    =  genericTake n (repeat x)- -zip4                    :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)]-zip4                    =  zipWith4 (,,,)--zip5                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)]-zip5                    =  zipWith5 (,,,,)--zip6                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> -                              [(a,b,c,d,e,f)]-zip6                    =  zipWith6 (,,,,,)--zip7                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->-                              [g] -> [(a,b,c,d,e,f,g)]-zip7                    =  zipWith7 (,,,,,,)--zipWith4                :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e]-zipWith4 z (a:as) (b:bs) (c:cs) (d:ds)-                        =  z a b c d : zipWith4 z as bs cs ds-zipWith4 _ _ _ _ _      =  []--zipWith5                :: (a->b->c->d->e->f) -> -                           [a]->[b]->[c]->[d]->[e]->[f]-zipWith5 z (a:as) (b:bs) (c:cs) (d:ds) (e:es)-                        =  z a b c d e : zipWith5 z as bs cs ds es-zipWith5 _ _ _ _ _ _    =  []--zipWith6                :: (a->b->c->d->e->f->g) ->-                           [a]->[b]->[c]->[d]->[e]->[f]->[g]-zipWith6 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs)-                        =  z a b c d e f : zipWith6 z as bs cs ds es fs-zipWith6 _ _ _ _ _ _ _  =  []--zipWith7                :: (a->b->c->d->e->f->g->h) ->-                           [a]->[b]->[c]->[d]->[e]->[f]->[g]->[h]-zipWith7 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs) (g:gs)-                   =  z a b c d e f g : zipWith7 z as bs cs ds es fs gs-zipWith7 _ _ _ _ _ _ _ _ = []--unzip4                  :: [(a,b,c,d)] -> ([a],[b],[c],[d])-unzip4                  =  foldr (\(a,b,c,d) ~(as,bs,cs,ds) ->-                                        (a:as,b:bs,c:cs,d:ds))-                                 ([],[],[],[])--unzip5                  :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e])-unzip5                  =  foldr (\(a,b,c,d,e) ~(as,bs,cs,ds,es) ->-                                        (a:as,b:bs,c:cs,d:ds,e:es))-                                 ([],[],[],[],[])--unzip6                  :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f])-unzip6                  =  foldr (\(a,b,c,d,e,f) ~(as,bs,cs,ds,es,fs) ->-                                        (a:as,b:bs,c:cs,d:ds,e:es,f:fs))-                                 ([],[],[],[],[],[])--unzip7          :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g])-unzip7          =  foldr (\(a,b,c,d,e,f,g) ~(as,bs,cs,ds,es,fs,gs) ->-                                (a:as,b:bs,c:cs,d:ds,e:es,f:fs,g:gs))-                         ([],[],[],[],[],[],[])
− tests/Spec/ListExts.hs
@@ -1,33 +0,0 @@--- Spececifications of things in Data.List but not in the H98 List module---module Spec.ListExts (-  foldl',-  foldl1',-  -  intercalate,--  isInfixOf,-  ) where--import Prelude (Int, Integer, Integral, Num(..), Eq(..), Ord(..), Ordering(..),-                Bool(..), (&&), (||), not, Maybe(..), String, -                (.), error, seq, otherwise, flip)-import Spec.List--foldl'            :: (a -> b -> a) -> a -> [b] -> a-foldl' f z []     =  z-foldl' f z (x:xs) =  let z' = f z x in z' `seq` foldl f z' xs---foldl1'           :: (a -> a -> a) -> [a] -> a-foldl1' f (x:xs)  =  foldl' f x xs-foldl1' _ []      =  error "Prelude.foldl1: empty list"---isInfixOf :: Eq a => [a] -> [a] -> Bool-isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)---intercalate :: [a] -> [[a]] -> [a]-intercalate xs xss = concat (intersperse xs xss)
− tests/Spec/PreludeList.hs
@@ -1,358 +0,0 @@--- Taken from the Haskell 98 Report:--- http://haskell.org/onlinereport/---- Modifications to make it compile:---   changed module name---   limited import list from the real Prelude--module Spec.PreludeList (-    map, (++), filter, concat, concatMap, -    head, last, tail, init, null, length, (!!), -    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,-    iterate, repeat, replicate, cycle,-    take, drop, splitAt, takeWhile, dropWhile, span, break,-    lines, words, unlines, unwords, reverse, and, or,-    any, all, elem, notElem, lookup,-    sum, product, maximum, minimum, -    zip, zip3, zipWith, zipWith3, unzip, unzip3)-  where--import Prelude (Int, Integer, Integral, Num(..), Eq(..), Ord(..), Ordering(..),-                Bool(..), (&&), (||), not, Maybe(..), String, -                (.), error, seq, otherwise, flip)-import qualified Char(isSpace)--infixl 9  !!-infixr 5  ++-infix  4  `elem`, `notElem`---- Map and append--map :: (a -> b) -> [a] -> [b]-map f []     = []-map f (x:xs) = f x : map f xs---(++) :: [a] -> [a] -> [a]-[]     ++ ys = ys-(x:xs) ++ ys = x : (xs ++ ys)---filter :: (a -> Bool) -> [a] -> [a]-filter p []                 = []-filter p (x:xs) | p x       = x : filter p xs-                | otherwise = filter p xs---concat :: [[a]] -> [a]-concat xss = foldr (++) [] xss---concatMap :: (a -> [b]) -> [a] -> [b]-concatMap f = concat . map f---- head and tail extract the first element and remaining elements,--- respectively, of a list, which must be non-empty.  last and init--- are the dual functions working from the end of a finite list,--- rather than the beginning.---head             :: [a] -> a-head (x:_)       =  x-head []          =  error "Prelude.head: empty list"---tail             :: [a] -> [a]-tail (_:xs)      =  xs-tail []          =  error "Prelude.tail: empty list"---last             :: [a] -> a-last [x]         =  x-last (_:xs)      =  last xs-last []          =  error "Prelude.last: empty list"---init             :: [a] -> [a]-init [x]         =  []-init (x:xs)      =  x : init xs-init []          =  error "Prelude.init: empty list"---null             :: [a] -> Bool-null []          =  True-null (_:_)       =  False---- length returns the length of a finite list as an Int.--length           :: [a] -> Int-length []        =  0-length (_:l)     =  1 + length l---- List index (subscript) operator, 0-origin--(!!)                :: [a] -> Int -> a-xs     !! n | n < 0 =  error "Prelude.!!: negative index"-[]     !! _         =  error "Prelude.!!: index too large"-(x:_)  !! 0         =  x-(_:xs) !! n         =  xs !! (n-1)---- foldl, applied to a binary operator, a starting value (typically the--- left-identity of the operator), and a list, reduces the list using--- the binary operator, from left to right:---  foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn--- foldl1 is a variant that has no starting value argument, and  thus must--- be applied to non-empty lists.  scanl is similar to foldl, but returns--- a list of successive reduced values from the left:---      scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]--- Note that  last (scanl f z xs) == foldl f z xs.--- scanl1 is similar, again without the starting element:---      scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]---foldl            :: (a -> b -> a) -> a -> [b] -> a-foldl f z []     =  z-foldl f z (x:xs) =  foldl f (f z x) xs---foldl1           :: (a -> a -> a) -> [a] -> a-foldl1 f (x:xs)  =  foldl f x xs-foldl1 _ []      =  error "Prelude.foldl1: empty list"---scanl            :: (a -> b -> a) -> a -> [b] -> [a]-scanl f q xs     =  q : (case xs of-                            []   -> []-                            x:xs -> scanl f (f q x) xs)---scanl1           :: (a -> a -> a) -> [a] -> [a]-scanl1 f (x:xs)  =  scanl f x xs-scanl1 _ []      =  []---- foldr, foldr1, scanr, and scanr1 are the right-to-left duals of the--- above functions.---foldr            :: (a -> b -> b) -> b -> [a] -> b-foldr f z []     =  z-foldr f z (x:xs) =  f x (foldr f z xs)---foldr1           :: (a -> a -> a) -> [a] -> a-foldr1 f [x]     =  x-foldr1 f (x:xs)  =  f x (foldr1 f xs)-foldr1 _ []      =  error "Prelude.foldr1: empty list"---scanr             :: (a -> b -> b) -> b -> [a] -> [b]-scanr f q0 []     =  [q0]-scanr f q0 (x:xs) =  f x q : qs-                     where qs@(q:_) = scanr f q0 xs ---scanr1          :: (a -> a -> a) -> [a] -> [a]-scanr1 f []     =  []-scanr1 f [x]    =  [x]-scanr1 f (x:xs) =  f x q : qs-                   where qs@(q:_) = scanr1 f xs ---- iterate f x returns an infinite list of repeated applications of f to x:--- iterate f x == [x, f x, f (f x), ...]--iterate          :: (a -> a) -> a -> [a]-iterate f x      =  x : iterate f (f x)---- repeat x is an infinite list, with x the value of every element.--repeat           :: a -> [a]-repeat x         =  xs where xs = x:xs---- replicate n x is a list of length n with x the value of every element--replicate        :: Int -> a -> [a]-replicate n x    =  take n (repeat x)---- cycle ties a finite list into a circular one, or equivalently,--- the infinite repetition of the original list.  It is the identity--- on infinite lists.---cycle            :: [a] -> [a]-cycle []         =  error "Prelude.cycle: empty list"-cycle xs         =  xs' where xs' = xs ++ xs'---- take n, applied to a list xs, returns the prefix of xs of length n,--- or xs itself if n > length xs.  drop n xs returns the suffix of xs--- after the first n elements, or [] if n > length xs.  splitAt n xs--- is equivalent to (take n xs, drop n xs).---take                   :: Int -> [a] -> [a]-take n _      | n <= 0 =  []-take _ []              =  []-take n (x:xs)          =  x : take (n-1) xs---drop                   :: Int -> [a] -> [a]-drop n xs     | n <= 0 =  xs-drop _ []              =  []-drop n (_:xs)          =  drop (n-1) xs---splitAt                  :: Int -> [a] -> ([a],[a])-splitAt n xs             =  (take n xs, drop n xs)---- takeWhile, applied to a predicate p and a list xs, returns the longest--- prefix (possibly empty) of xs of elements that satisfy p.  dropWhile p xs--- returns the remaining suffix.  span p xs is equivalent to --- (takeWhile p xs, dropWhile p xs), while break p uses the negation of p.---takeWhile               :: (a -> Bool) -> [a] -> [a]-takeWhile p []          =  []-takeWhile p (x:xs) -            | p x       =  x : takeWhile p xs-            | otherwise =  []---dropWhile               :: (a -> Bool) -> [a] -> [a]-dropWhile p []          =  []-dropWhile p xs@(x:xs')-            | p x       =  dropWhile p xs'-            | otherwise =  xs---span, break             :: (a -> Bool) -> [a] -> ([a],[a])-span p []            = ([],[])-span p xs@(x:xs') -            | p x       =  (x:ys,zs) -            | otherwise =  ([],xs)-                           where (ys,zs) = span p xs'--break p                 =  span (not . p)---- lines breaks a string up into a list of strings at newline characters.--- The resulting strings do not contain newlines.  Similary, words--- breaks a string up into a list of words, which were delimited by--- white space.  unlines and unwords are the inverse operations.--- unlines joins lines with terminating newlines, and unwords joins--- words with separating spaces.---lines            :: String -> [String]-lines ""         =  []-lines s          =  let (l, s') = break (== '\n') s-                      in  l : case s' of-                                []      -> []-                                (_:s'') -> lines s''---words            :: String -> [String]-words s          =  case dropWhile Char.isSpace s of-                      "" -> []-                      s' -> w : words s''-                            where (w, s'') = break Char.isSpace s'---unlines          :: [String] -> String-unlines          =  concatMap (++ "\n")---unwords          :: [String] -> String-unwords []       =  ""-unwords ws       =  foldr1 (\w s -> w ++ ' ':s) ws---- reverse xs returns the elements of xs in reverse order.  xs must be finite.--reverse          :: [a] -> [a]-reverse          =  foldl (flip (:)) []---- and returns the conjunction of a Boolean list.  For the result to be--- True, the list must be finite; False, however, results from a False--- value at a finite index of a finite or infinite list.  or is the--- disjunctive dual of and.--and, or          :: [Bool] -> Bool-and              =  foldr (&&) True-or               =  foldr (||) False---- Applied to a predicate and a list, any determines if any element--- of the list satisfies the predicate.  Similarly, for all.--any, all         :: (a -> Bool) -> [a] -> Bool-any p            =  or . map p-all p            =  and . map p---- elem is the list membership predicate, usually written in infix form,--- e.g., x `elem` xs.  notElem is the negation.--elem, notElem    :: (Eq a) => a -> [a] -> Bool-elem x           =  any (== x)-notElem x        =  all (/= x)---- lookup key assocs looks up a key in an association list.--lookup           :: (Eq a) => a -> [(a,b)] -> Maybe b-lookup key []    =  Nothing-lookup key ((x,y):xys)-    | key == x   =  Just y-    | otherwise  =  lookup key xys---- sum and product compute the sum or product of a finite list of numbers.--sum, product     :: (Num a) => [a] -> a-sum              =  foldl (+) 0  -product          =  foldl (*) 1---- maximum and minimum return the maximum or minimum value from a list,--- which must be non-empty, finite, and of an ordered type.--maximum, minimum :: (Ord a) => [a] -> a-maximum []       =  error "Prelude.maximum: empty list"-maximum xs       =  foldl1 max xs--minimum []       =  error "Prelude.minimum: empty list"-minimum xs       =  foldl1 min xs---- zip takes two lists and returns a list of corresponding pairs.  If one--- input list is short, excess elements of the longer list are discarded.--- zip3 takes three lists and returns a list of triples.  Zips for larger--- tuples are in the List library---zip              :: [a] -> [b] -> [(a,b)]-zip              =  zipWith (,)---zip3             :: [a] -> [b] -> [c] -> [(a,b,c)]-zip3             =  zipWith3 (,,)---- The zipWith family generalises the zip family by zipping with the--- function given as the first argument, instead of a tupling function.--- For example, zipWith (+) is applied to two lists to produce the list--- of corresponding sums.---zipWith          :: (a->b->c) -> [a]->[b]->[c]-zipWith z (a:as) (b:bs)-                 =  z a b : zipWith z as bs-zipWith _ _ _    =  []---zipWith3         :: (a->b->c->d) -> [a]->[b]->[c]->[d]-zipWith3 z (a:as) (b:bs) (c:cs)-                 =  z a b c : zipWith3 z as bs cs-zipWith3 _ _ _ _ =  []----- unzip transforms a list of pairs into a pair of lists.  ---unzip            :: [(a,b)] -> ([a],[b])-unzip            =  foldr (\(a,b) ~(as,bs) -> (a:as,b:bs)) ([],[])---unzip3           :: [(a,b,c)] -> ([a],[b],[c])-unzip3           =  foldr (\(a,b,c) ~(as,bs,cs) -> (a:as,b:bs,c:cs))-                          ([],[],[])
− tests/Strictness/BaseVsSpec.hs
@@ -1,391 +0,0 @@------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import Prelude hiding (null)-import Strictness.Utils-import System.IO--import qualified Strictness.Monomorphic.Base     as Test        -- base implementation-import qualified Strictness.Monomorphic.Spec     as Spec        -- H98 spec------- Data.List <=> Spec.List-------------------------------------------------------------------------------- * Basic interface--prop_append     = (Test.++)     `eq2`           (Spec.++)-prop_head       = Test.head     `eq1`           Spec.head-prop_last       = Test.last     `eq1`           Spec.last-prop_tail       = Test.tail     `eq1`           Spec.tail-prop_init       = Test.init     `eq1`           Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map-prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate-prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'-prop_foldl1     = Test.foldl1           `eq2`   Spec.foldl1-prop_foldl1'    = Test.foldl1'          `eq2`   Spec.foldl1'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1           `eq2`   Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum          `eq1`   Spec.maximum-prop_minimum    = Test.minimum          `eq1`   Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr-prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate    `eqfinite2`   Spec.iterate-prop_repeat     = Test.repeat     `eqfinite1`   Spec.repeat-prop_replicate  = Test.replicate  `eqfinite2`   Spec.replicate-prop_cycle      = Test.cycle      `eqfinite1`   Spec.cycle----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr    `eqfinite2`   Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt  -- base is stricter than the spec-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile-prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem-prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter-prop_partition  = Test.partition        `eq2`   Spec.partition  -- base is stricter than the spec----------------------------------------------------------------------------- * Indexing lists--prop_index              = (Test.!!)             `eq2`   (Spec.!!)-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip---prop_zip3       = Test.zip3             `eq3`   Spec.zip3---prop_zip4       = Test.zip4             `eq4`   Spec.zip4---prop_zip5       = Test.zip5             `eq5`   Spec.zip5---prop_zip6       = Test.zip6             `eq6`   Spec.zip6---prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip---prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3---prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4---prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5---prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6---prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords          `eq1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists --prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--prop_sortBy             = Test.sortBy           `eq2`    Spec.sortBy     --need to generate total orders-prop_insertBy           = Test.insertBy         `eq3`    Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eq2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eq2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`    Spec.genericLength-prop_genericTake        = Test.genericTake      `eq2`    Spec.genericTake    -- we disagree with the spec-prop_genericDrop        = Test.genericDrop      `eq2`    Spec.genericDrop-prop_genericSplitAt     = Test.genericSplitAt   `eq2`    Spec.genericSplitAt-prop_genericIndex       = Test.genericIndex     `eq2`    Spec.genericIndex-prop_genericReplicate   = Test.genericReplicate `eqfinite2`    Spec.genericReplicate----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing Data.List <=> Spec.List"-  putStrLn "===============================\n"--  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map-    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate-    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-    ,run prop_scanr-    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile-    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-    ,run prop_isSuffixOf-    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem-    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter-    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts { testDepth = 6, maxTests = 100000 }-    [run prop_zip---    ,run prop_zip3---    ,run prop_zip4---    ,run prop_zip5---    ,run prop_zip6---    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip---    ,run prop_unzip3---    ,run prop_unzip4---    ,run prop_unzip5---    ,run prop_unzip6---    ,run prop_unzip7-    ]--  runTests "Functions on strings" opts-    [run prop_lines-    ,run prop_words-    ,run prop_unlines-    ,run prop_unwords-    ]--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [run prop_sortBy        -- note issue here.-    ,run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]
− tests/Strictness/ListVsBase.hs
@@ -1,400 +0,0 @@------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import Prelude hiding (null)-import Strictness.Utils-import System.IO--import qualified Strictness.Monomorphic.List     as Test        -- our implementation-import qualified Strictness.Monomorphic.Base     as Spec        -- base implementation------- Data.List.Stream <=> Data.List-------------------------------------------------------------------------------- * Basic interface--prop_append     = (Test.++)     `eq2`           (Spec.++)-prop_head       = Test.head     `eq1`           Spec.head-prop_last       = Test.last     `eq1`           Spec.last-prop_tail       = Test.tail     `eq1`           Spec.tail-prop_init       = Test.init     `eq1`           Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map-prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse `refines2`   Spec.intersperse-prop_intercalate        = Test.intercalate `refines2`   Spec.intercalate-prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'   -- we're stricter than the 'spec'-prop_foldl1     = Test.foldl1           `eq2`   Spec.foldl1-prop_foldl1'    = Test.foldl1'          `eq2`   Spec.foldl1'  -- we're stricter than the 'spec'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1           `eq2`   Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum          `eq1`   Spec.maximum-prop_minimum    = Test.minimum          `eq1`   Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr-prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate    `eqfinite2`   Spec.iterate-prop_repeat     = Test.repeat     `eqfinite1`   Spec.repeat-prop_replicate  = Test.replicate  `eqfinite2`   Spec.replicate-prop_cycle      = Test.cycle      `eqfinite1`   Spec.cycle----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr    `eqfinite2`   Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt  -- we're stricter than the spec-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile-prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem-prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter-prop_partition  = Test.partition        `eq2`   Spec.partition  -- we're stricter than the spec----------------------------------------------------------------------------- * Indexing lists--prop_index              = (Test.!!)             `eq2`   (Spec.!!)-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip---prop_zip3       = Test.zip3             `eq3`   Spec.zip3---prop_zip4       = Test.zip4             `eq4`   Spec.zip4---prop_zip5       = Test.zip5             `eq5`   Spec.zip5---prop_zip6       = Test.zip6             `eq6`   Spec.zip6---prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip---prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3---prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4---prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5---prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6---prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords     `refines1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists --prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--prop_sortBy             = Test.sortBy           `eq2`    Spec.sortBy     --need to generate total orders-prop_insertBy           = Test.insertBy         `eq3`    Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eq2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eq2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`    Spec.genericLength-prop_genericTake        = Test.genericTake      `eq2`    Spec.genericTake    -- we disagree with the spec-prop_genericDrop        = Test.genericDrop      `eq2`    Spec.genericDrop-prop_genericSplitAt     = Test.genericSplitAt   `eq2`    Spec.genericSplitAt-prop_genericIndex       = Test.genericIndex     `eq2`    Spec.genericIndex-prop_genericReplicate   = Test.genericReplicate `eqfinite2`    Spec.genericReplicate----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing Data.List.Stream <=> Data.List"-  putStrLn "======================================\n"--  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map-    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate-    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-    ,run prop_scanr-    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile-    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-    ,run prop_isSuffixOf-    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem-    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter-    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts { testDepth = 6, maxTests = 100000 }-    [run prop_zip---    ,run prop_zip3---    ,run prop_zip4---    ,run prop_zip5---    ,run prop_zip6---    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip---    ,run prop_unzip3---    ,run prop_unzip4---    ,run prop_unzip5---    ,run prop_unzip6---    ,run prop_unzip7-    ]--  runTests "Functions on strings" opts-    [run prop_lines-    ,run prop_words-    ,run prop_unlines-    ,run prop_unwords-    ]--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [run prop_sortBy        -- note issue here.-    ,run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]-{--run :: Testable a => a -> Int -> IO ()-run = flip depthCheck--runTests :: String -> [Int -> IO ()] -> IO ()-runTests name tests = do-  putStrLn name-  mapM_ ($ 6) tests--}
− tests/Strictness/ListVsSpec.hs
@@ -1,400 +0,0 @@------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import Prelude hiding (null)-import Strictness.Utils-import System.IO--import qualified Strictness.Monomorphic.List     as Test        -- our implementation-import qualified Strictness.Monomorphic.Spec     as Spec        -- H98 spec------- Data.List.Stream <=> Spec.List-------------------------------------------------------------------------------- * Basic interface--prop_append     = (Test.++)     `eq2`           (Spec.++)-prop_head       = Test.head     `eq1`           Spec.head-prop_last       = Test.last     `eq1`           Spec.last-prop_tail       = Test.tail     `eq1`           Spec.tail-prop_init       = Test.init     `eq1`           Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map-prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse `refines2`   Spec.intersperse-prop_intercalate        = Test.intercalate `refines2`   Spec.intercalate-prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'   -- we're stricter than the 'spec'-prop_foldl1     = Test.foldl1           `eq2`   Spec.foldl1-prop_foldl1'    = Test.foldl1'          `eq2`   Spec.foldl1'  -- we're stricter than the 'spec'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1           `eq2`   Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum          `eq1`   Spec.maximum-prop_minimum    = Test.minimum          `eq1`   Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1-prop_scanr      = Test.scanr            `eq3`   Spec.scanr-prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps--prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL-prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate    `eqfinite2`   Spec.iterate-prop_repeat     = Test.repeat     `eqfinite1`   Spec.repeat-prop_replicate  = Test.replicate  `eqfinite2`   Spec.replicate-prop_cycle      = Test.cycle      `eqfinite1`   Spec.cycle----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr    `eqfinite2`   Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt  -- we're stricter than the spec-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile-prop_span       = Test.span             `eq2`   Spec.span-prop_break      = Test.break            `eq2`   Spec.break-prop_group      = Test.group            `eq1`   Spec.group-prop_inits      = Test.inits            `eq1`   Spec.inits-prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf-prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf-prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem-prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter-prop_partition  = Test.partition        `eq2`   Spec.partition  -- we're stricter than the spec----------------------------------------------------------------------------- * Indexing lists--prop_index              = (Test.!!)             `eq2`   (Spec.!!)-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip---prop_zip3       = Test.zip3             `eq3`   Spec.zip3---prop_zip4       = Test.zip4             `eq4`   Spec.zip4---prop_zip5       = Test.zip5             `eq5`   Spec.zip5---prop_zip6       = Test.zip6             `eq6`   Spec.zip6---prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4-prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5-prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6-prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip---prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3---prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4---prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5---prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6---prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings--prop_lines      = Test.lines            `eq1`   Spec.lines-prop_words      = Test.words            `eq1`   Spec.words-prop_unlines    = Test.unlines          `eq1`   Spec.unlines-prop_unwords    = Test.unwords     `refines1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations--prop_nub        = Test.nub              `eq1`   Spec.nub-prop_delete     = Test.delete           `eq2`   Spec.delete-prop_difference = (Test.\\)             `eq2`   (Spec.\\)-prop_union      = Test.union            `eq2`   Spec.union-prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists --prop_sort       = Test.sort             `eq1`   Spec.sort-prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)--prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy-prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy-prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy-prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy-prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy-prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)--prop_sortBy             = Test.sortBy           `eq2`    Spec.sortBy     --need to generate total orders-prop_insertBy           = Test.insertBy         `eq3`    Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eq2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eq2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`    Spec.genericLength-prop_genericTake        = Test.genericTake      `eq2`    Spec.genericTake    -- we disagree with the spec-prop_genericDrop        = Test.genericDrop      `eq2`    Spec.genericDrop-prop_genericSplitAt     = Test.genericSplitAt   `eq2`    Spec.genericSplitAt-prop_genericIndex       = Test.genericIndex     `eq2`    Spec.genericIndex-prop_genericReplicate   = Test.genericReplicate `eqfinite2`    Spec.genericReplicate----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing Data.List.Stream <=> Spec.List"-  putStrLn "======================================\n"--  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map-    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate-    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1-    ,run prop_scanr-    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [run prop_mapAccumL-    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile-    ,run prop_span-    ,run prop_break-    ,run prop_group-    ,run prop_inits-    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf-    ,run prop_isSuffixOf-    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem-    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter-    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts { testDepth = 6, maxTests = 100000 }-    [run prop_zip---    ,run prop_zip3---    ,run prop_zip4---    ,run prop_zip5---    ,run prop_zip6---    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4-    ,run prop_zipWith5-    ,run prop_zipWith6-    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip---    ,run prop_unzip3---    ,run prop_unzip4---    ,run prop_unzip5---    ,run prop_unzip6---    ,run prop_unzip7-    ]--  runTests "Functions on strings" opts-    [run prop_lines-    ,run prop_words-    ,run prop_unlines-    ,run prop_unwords-    ]--  runTests "\"Set\" operations" opts-    [run prop_nub-    ,run prop_delete-    ,run prop_difference-    ,run prop_union-    ,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [run prop_sort-    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [run prop_nubBy-    ,run prop_deleteBy-    ,run prop_deleteFirstsBy-    ,run prop_unionBy-    ,run prop_intersectBy-    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [run prop_sortBy        -- note issue here.-    ,run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]-{--run :: Testable a => a -> Int -> IO ()-run = flip depthCheck--runTests :: String -> [Int -> IO ()] -> IO ()-runTests name tests = do-  putStrLn name-  mapM_ ($ 6) tests--}
− tests/Strictness/Monomorphic/Base.hs
@@ -1,321 +0,0 @@------ The Data.List api----module Strictness.Monomorphic.Base where--import Strictness.Utils--import qualified Data.List as Spec---- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (Spec.++)-head            = Spec.head-last            = Spec.last-tail            = Spec.tail-init            = Spec.init-null            = Spec.null-length          = Spec.length---- * List transformations-map             = Spec.map-reverse         = Spec.reverse-intersperse     = Spec.intersperse---- intercalate     = -- Spec.intercalate-intercalate xs xss = Spec.concat (Spec.intersperse xs xss)--transpose       = Spec.transpose---- * Reducing lists (folds)-foldl           = Spec.foldl-foldl'          = Spec.foldl'-foldl1          = Spec.foldl1-foldl1'         = Spec.foldl1'-foldr           = Spec.foldr-foldr1          = Spec.foldr1---- ** Special folds-concat          = Spec.concat-concatMap       = Spec.concatMap-and             = Spec.and-or              = Spec.or-any             = Spec.any-all             = Spec.all-sum             = Spec.sum-product         = Spec.product-maximum         = Spec.maximum-minimum         = Spec.minimum---- * Building lists--- ** Scans-scanl           = Spec.scanl-scanl1          = Spec.scanl1-scanr           = Spec.scanr-scanr1          = Spec.scanr1---- ** Accumulating maps-mapAccumL       = Spec.mapAccumL-mapAccumR       = Spec.mapAccumR---- ** Infinite lists-iterate         = Spec.iterate-repeat          = Spec.repeat-replicate       = Spec.replicate-cycle           = Spec.cycle---- ** Unfolding-unfoldr         = Spec.unfoldr---- * Sublists--- ** Extracting sublists-take            = Spec.take-drop            = Spec.drop-splitAt         = Spec.splitAt-takeWhile       = Spec.takeWhile-dropWhile       = Spec.dropWhile-span            = Spec.span-break           = Spec.break-group           = Spec.group-inits           = Spec.inits-tails           = Spec.tails---- * Predicates-isPrefixOf      = Spec.isPrefixOf-isSuffixOf      = Spec.isSuffixOf-isInfixOf       = Spec.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = Spec.elem-notElem         = Spec.notElem-lookup          = Spec.lookup---- ** Searching with a predicate-find            = Spec.find-filter          = Spec.filter-partition       = Spec.partition---- * Indexing lists-(!!)            = (Spec.!!)-elemIndex       = Spec.elemIndex-elemIndices     = Spec.elemIndices-findIndex       = Spec.findIndex-findIndices     = Spec.findIndices---- * Zipping and unzipping lists-zip             = Spec.zip-zip3            = Spec.zip3-zip4            = Spec.zip4-zip5            = Spec.zip5-zip6            = Spec.zip6-zip7            = Spec.zip7-zipWith         = Spec.zipWith-zipWith3        = Spec.zipWith3-zipWith4        = Spec.zipWith4-zipWith5        = Spec.zipWith5-zipWith6        = Spec.zipWith6-zipWith7        = Spec.zipWith7-unzip           = Spec.unzip-unzip3          = Spec.unzip3-unzip4          = Spec.unzip4-unzip5          = Spec.unzip5-unzip6          = Spec.unzip6-unzip7          = Spec.unzip7---- * Special lists--- ** Functions on strings-lines           = Spec.lines-words           = Spec.words-unlines         = Spec.unlines-unwords         = Spec.unwords---- ** \"Set\" operations-nub             = Spec.nub-delete          = Spec.delete-(\\)            = (Spec.\\)-union           = Spec.union-intersect       = Spec.intersect---- ** Ordered lists -sort            = Spec.sort-insert          = Spec.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Spec.nubBy-deleteBy        = Spec.deleteBy-deleteFirstsBy  = Spec.deleteFirstsBy-unionBy         = Spec.unionBy-intersectBy     = Spec.intersectBy-groupBy         = Spec.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = Spec.sortBy-insertBy        = Spec.insertBy-maximumBy       = Spec.maximumBy-minimumBy       = Spec.minimumBy---- * The \"generic\" operations-genericLength           = Spec.genericLength-genericTake             = Spec.genericTake-genericDrop             = Spec.genericDrop-genericSplitAt          = Spec.genericSplitAt-genericIndex            = Spec.genericIndex-genericReplicate        = Spec.genericReplicate
− tests/Strictness/Monomorphic/List.hs
@@ -1,319 +0,0 @@-module Strictness.Monomorphic.List where------- just test the List api-----import Strictness.Utils--import qualified Data.List.Stream as List---- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]       --fixme: need to use Bool domain for order-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (List.++)-head            = List.head-last            = List.last-tail            = List.tail-init            = List.init-null            = List.null-length          = List.length---- * List transformations-map             = List.map-reverse         = List.reverse-intersperse     = List.intersperse-intercalate     = List.intercalate-transpose       = List.transpose---- * Reducing lists (folds)-foldl           = List.foldl-foldl'          = List.foldl'-foldl1          = List.foldl1-foldl1'         = List.foldl1'-foldr           = List.foldr-foldr1          = List.foldr1---- ** Special folds-concat          = List.concat-concatMap       = List.concatMap-and             = List.and-or              = List.or-any             = List.any-all             = List.all-sum             = List.sum-product         = List.product-maximum         = List.maximum-minimum         = List.minimum---- * Building lists--- ** Scans-scanl           = List.scanl-scanl1          = List.scanl1-scanr           = List.scanr-scanr1          = List.scanr1---- ** Accumulating maps-mapAccumL       = List.mapAccumL-mapAccumR       = List.mapAccumR---- ** Infinite lists-iterate         = List.iterate-repeat          = List.repeat-replicate       = List.replicate-cycle           = List.cycle---- ** Unfolding-unfoldr         = List.unfoldr---- * Sublists--- ** Extracting sublists-take            = List.take-drop            = List.drop-splitAt         = List.splitAt-takeWhile       = List.takeWhile-dropWhile       = List.dropWhile-span            = List.span-break           = List.break-group           = List.group-inits           = List.inits-tails           = List.tails---- * Predicates-isPrefixOf      = List.isPrefixOf-isSuffixOf      = List.isSuffixOf-isInfixOf       = List.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = List.elem-notElem         = List.notElem-lookup          = List.lookup---- ** Searching with a predicate-find            = List.find-filter          = List.filter-partition       = List.partition---- * Indexing lists-(!!)            = (List.!!)-elemIndex       = List.elemIndex-elemIndices     = List.elemIndices-findIndex       = List.findIndex-findIndices     = List.findIndices---- * Zipping and unzipping lists-zip             = List.zip-zip3            = List.zip3-zip4            = List.zip4-zip5            = List.zip5-zip6            = List.zip6-zip7            = List.zip7-zipWith         = List.zipWith-zipWith3        = List.zipWith3-zipWith4        = List.zipWith4-zipWith5        = List.zipWith5-zipWith6        = List.zipWith6-zipWith7        = List.zipWith7-unzip           = List.unzip-unzip3          = List.unzip3-unzip4          = List.unzip4-unzip5          = List.unzip5-unzip6          = List.unzip6-unzip7          = List.unzip7---- * Special lists--- ** Functions on strings-lines           = List.lines-words           = List.words-unlines         = List.unlines-unwords         = List.unwords---- ** \"Set\" operations-nub             = List.nub-delete          = List.delete-(\\)            = (List.\\)-union           = List.union-intersect       = List.intersect---- ** Ordered lists -sort            = List.sort-insert          = List.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = List.nubBy-deleteBy        = List.deleteBy-deleteFirstsBy  = List.deleteFirstsBy-unionBy         = List.unionBy-intersectBy     = List.intersectBy-groupBy         = List.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = List.sortBy-insertBy        = List.insertBy-maximumBy       = List.maximumBy-minimumBy       = List.minimumBy---- * The \"generic\" operations-genericLength           = List.genericLength-genericTake             = List.genericTake-genericDrop             = List.genericDrop-genericSplitAt          = List.genericSplitAt-genericIndex            = List.genericIndex-genericReplicate        = List.genericReplicate
− tests/Strictness/Monomorphic/Spec.hs
@@ -1,321 +0,0 @@-module Strictness.Monomorphic.Spec where------- just test the List api-----import Strictness.Utils--import qualified Spec.List     as Spec-import qualified Spec.ListExts as Spec----- * Basic interface-(++)            :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int---- * List transformations-map             :: (A -> B) -> [A] -> [B]-reverse         :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate     :: [A] -> [[A]] -> [A]-transpose       :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]-scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]-span            :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool-notElem         :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]-partition       :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]-zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]-unzip           :: [(A, B)] -> ([A], [B])-unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])---- * Special lists--- ** Functions on strings-lines           :: String -> [String]-words           :: String -> [String]-unlines         :: [String] -> String-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]---- *** User-supplied comparison (replacing an Ord context)-sortBy          :: (A -> A -> Ordering) -> [A] -> [A]-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericSplitAt          :: I -> [A] -> ([A], [A])-genericIndex            :: [A] -> I -> A-genericReplicate        :: I -> A -> [A]------ * Basic interface-(++)            = (Spec.++)-head            = Spec.head-last            = Spec.last-tail            = Spec.tail-init            = Spec.init-null            = Spec.null-length          = Spec.length---- * List transformations-map             = Spec.map-reverse         = Spec.reverse-intersperse     = Spec.intersperse-intercalate     = Spec.intercalate-transpose       = Spec.transpose---- * Reducing lists (folds)-foldl           = Spec.foldl-foldl'          = Spec.foldl'-foldl1          = Spec.foldl1-foldl1'         = Spec.foldl1'-foldr           = Spec.foldr-foldr1          = Spec.foldr1---- ** Special folds-concat          = Spec.concat-concatMap       = Spec.concatMap-and             = Spec.and-or              = Spec.or-any             = Spec.any-all             = Spec.all-sum             = Spec.sum-product         = Spec.product-maximum         = Spec.maximum-minimum         = Spec.minimum---- * Building lists--- ** Scans-scanl           = Spec.scanl-scanl1          = Spec.scanl1-scanr           = Spec.scanr-scanr1          = Spec.scanr1---- ** Accumulating maps-mapAccumL       = Spec.mapAccumL-mapAccumR       = Spec.mapAccumR---- ** Infinite lists-iterate         = Spec.iterate-repeat          = Spec.repeat-replicate       = Spec.replicate-cycle           = Spec.cycle---- ** Unfolding-unfoldr         = Spec.unfoldr---- * Sublists--- ** Extracting sublists-take            = Spec.take-drop            = Spec.drop-splitAt         = Spec.splitAt-takeWhile       = Spec.takeWhile-dropWhile       = Spec.dropWhile-span            = Spec.span-break           = Spec.break-group           = Spec.group-inits           = Spec.inits-tails           = Spec.tails---- * Predicates-isPrefixOf      = Spec.isPrefixOf-isSuffixOf      = Spec.isSuffixOf-isInfixOf       = Spec.isInfixOf---- * Searching lists--- ** Searching by equality-elem            = Spec.elem-notElem         = Spec.notElem-lookup          = Spec.lookup---- ** Searching with a predicate-find            = Spec.find-filter          = Spec.filter-partition       = Spec.partition---- * Indexing lists-(!!)            = (Spec.!!)-elemIndex       = Spec.elemIndex-elemIndices     = Spec.elemIndices-findIndex       = Spec.findIndex-findIndices     = Spec.findIndices---- * Zipping and unzipping lists-zip             = Spec.zip-zip3            = Spec.zip3-zip4            = Spec.zip4-zip5            = Spec.zip5-zip6            = Spec.zip6-zip7            = Spec.zip7-zipWith         = Spec.zipWith-zipWith3        = Spec.zipWith3-zipWith4        = Spec.zipWith4-zipWith5        = Spec.zipWith5-zipWith6        = Spec.zipWith6-zipWith7        = Spec.zipWith7-unzip           = Spec.unzip-unzip3          = Spec.unzip3-unzip4          = Spec.unzip4-unzip5          = Spec.unzip5-unzip6          = Spec.unzip6-unzip7          = Spec.unzip7---- * Special lists--- ** Functions on strings-lines           = Spec.lines-words           = Spec.words-unlines         = Spec.unlines-unwords         = Spec.unwords---- ** \"Set\" operations-nub             = Spec.nub-delete          = Spec.delete-(\\)            = (Spec.\\)-union           = Spec.union-intersect       = Spec.intersect---- ** Ordered lists -sort            = Spec.sort-insert          = Spec.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Spec.nubBy-deleteBy        = Spec.deleteBy-deleteFirstsBy  = Spec.deleteFirstsBy-unionBy         = Spec.unionBy-intersectBy     = Spec.intersectBy-groupBy         = Spec.groupBy---- *** User-supplied comparison (replacing an Ord context)-sortBy          = Spec.sortBy-insertBy        = Spec.insertBy-maximumBy       = Spec.maximumBy-minimumBy       = Spec.minimumBy---- * The \"generic\" operations-genericLength           = Spec.genericLength-genericTake             = Spec.genericTake-genericDrop             = Spec.genericDrop-genericSplitAt          = Spec.genericSplitAt-genericIndex            = Spec.genericIndex-genericReplicate        = Spec.genericReplicate
− tests/Strictness/Monomorphic/StreamList.hs
@@ -1,385 +0,0 @@------ list like wrappers for abstract streams------ These specify the versions used when fusion occurs.------ So we can check our stream implementations, which are only used when--- fusion happens, are correct.-----module Strictness.Monomorphic.StreamList where--import Strictness.Utils--import qualified Data.Stream as Stream---- * Basic interface-cons            :: A -> [A] -> [A]-snoc            :: [A] -> A -> [A]-append          :: [A] -> [A] -> [A]-head            :: [A] -> A-last            :: [A] -> A-tail            :: [A] -> [A]-init            :: [A] -> [A]-null            :: [A] -> Bool-length          :: [A] -> Int----- * List transformations-map             :: (A -> B) -> [A] -> [B]---reverse       :: [A] -> [A]-intersperse     :: A -> [A] -> [A]-intercalate   :: [A] -> [[A]] -> [A]---transpose     :: [[A]] -> [[A]]---- * Reducing lists (folds)-foldl           :: (B -> A -> B) -> B -> [A] -> B-foldl'          :: (B -> A -> B) -> B -> [A] -> B-foldl1          :: (A -> A -> A) -> [A] -> A-foldl1'         :: (A -> A -> A) -> [A] -> A-foldr           :: (A -> B -> B) -> B -> [A] -> B-foldr1          :: (A -> A -> A) -> [A] -> A---- ** Special folds-concat          :: [[A]] -> [A]-concatMap       :: (A -> [B]) -> [A] -> [B]-and             :: [Bool] -> Bool-or              :: [Bool] -> Bool-any             :: (A -> Bool) -> [A] -> Bool-all             :: (A -> Bool) -> [A] -> Bool-sum             :: [N] -> N-product         :: [N] -> N-maximum         :: [OrdA] -> OrdA-minimum         :: [OrdA] -> OrdA---- * Building lists--- ** Scans-scanl           :: (A -> B -> A) -> A -> [B] -> [A]-scanl1          :: (A -> A -> A) -> [A] -> [A]--{--scanr           :: (A -> B -> B) -> B -> [A] -> [B]-scanr1          :: (A -> A -> A) -> [A] -> [A]---- ** Accumulating maps-mapAccumL       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])-mapAccumR       :: (C -> A -> (C, B)) -> C -> [A] -> (C, [B])--}---- ** Infinite lists-iterate         :: (A -> A) -> A -> [A]-repeat          :: A -> [A]-replicate       :: Int -> A -> [A]-cycle           :: [A] -> [A]---- ** Unfolding-unfoldr         :: (B -> Maybe (A, B)) -> B -> [A]---- * Sublists--- ** Extracting sublists-take            :: Int -> [A] -> [A]-drop            :: Int -> [A] -> [A]-splitAt         :: Int -> [A] -> ([A], [A])-takeWhile       :: (A -> Bool) -> [A] -> [A]-dropWhile       :: (A -> Bool) -> [A] -> [A]--{--span          :: (A -> Bool) -> [A] -> ([A], [A])-break           :: (A -> Bool) -> [A] -> ([A], [A])-group           :: [A] -> [[A]]-inits           :: [A] -> [[A]]-tails           :: [A] -> [[A]]--}---- * Predicates-isPrefixOf      :: [A] -> [A] -> Bool-{--isSuffixOf      :: [A] -> [A] -> Bool-isInfixOf       :: [A] -> [A] -> Bool--}---- * Searching lists--- ** Searching by equality-elem            :: A -> [A] -> Bool---notElem               :: A -> [A] -> Bool-lookup          :: A -> [(A, B)] -> Maybe B---- ** Searching with A predicate-find            :: (A -> Bool) -> [A] -> Maybe A-filter          :: (A -> Bool) -> [A] -> [A]---partition     :: (A -> Bool) -> [A] -> ([A], [A])---- * Indexing lists-(!!)            :: [A] -> Int -> A-findIndex       :: (A -> Bool) -> [A] -> Maybe Int-elemIndex       :: A -> [A] -> Maybe Int-elemIndices     :: A -> [A] -> [Int]-findIndices     :: (A -> Bool) -> [A] -> [Int]---- * Zipping and unzipping lists-zip             :: [A] -> [B] -> [(A, B)]-zip3            :: [A] -> [B] -> [C] -> [(A, B, C)]-{--zip4            :: [A] -> [B] -> [C] -> [D] -> [(A, B, C, D)]-zip5            :: [A] -> [B] -> [C] -> [D] -> [E] -> [(A, B, C, D, E)]-zip6            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [(A, B, C, D, E, F)]-zip7            :: [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [(A, B, C, D, E, F, G)]--}--zipWith         :: (A -> B -> C) -> [A] -> [B] -> [C]-zipWith3        :: (A -> B -> C -> D) -> [A] -> [B] -> [C] -> [D]-{--zipWith4        :: (A -> B -> C -> D -> E) -> [A] -> [B] -> [C] -> [D] -> [E]-zipWith5        :: (A -> B -> C -> D -> E -> F) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F]-zipWith6        :: (A -> B -> C -> D -> E -> F -> G) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G]-zipWith7        :: (A -> B -> C -> D -> E -> F -> G -> H) -> [A] -> [B] -> [C] -> [D] -> [E] -> [F] -> [G] -> [H]--}--unzip           :: [(A, B)] -> ([A], [B])-{--unzip3          :: [(A, B, C)] -> ([A], [B], [C])-unzip4          :: [(A, B, C, D)] -> ([A], [B], [C], [D])-unzip5          :: [(A, B, C, D, E)] -> ([A], [B], [C], [D], [E])-unzip6          :: [(A, B, C, D, E, F)] -> ([A], [B], [C], [D], [E], [F])-unzip7          :: [(A, B, C, D, E, F, G)] -> ([A], [B], [C], [D], [E], [F], [G])--}---- * Special lists--- ** Functions on strings---unlines         :: [String] -> String---lines           :: String -> [String]-{--words           :: String -> [String]-unwords         :: [String] -> String---- ** \"Set\" operations-nub             :: [A] -> [A]-delete          :: A -> [A] -> [A]-(\\)            :: [A] -> [A] -> [A]-union           :: [A] -> [A] -> [A]-intersect       :: [A] -> [A] -> [A]---- ** Ordered lists -sort            :: [OrdA] -> [OrdA]-insert          :: OrdA -> [OrdA] -> [OrdA]---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           :: (A -> A -> Bool) -> [A] -> [A]-deleteBy        :: (A -> A -> Bool) -> A -> [A] -> [A]-deleteFirstsBy  :: (A -> A -> Bool) -> [A] -> [A] -> [A]-unionBy         :: (A -> A -> Bool) -> [A] -> [A] -> [A]-intersectBy     :: (A -> A -> Bool) -> [A] -> [A] -> [A]-groupBy         :: (A -> A -> Bool) -> [A] -> [[A]]--}---- *** User-supplied comparison (replacing an Ord context)-insertBy        :: (A -> A -> Ordering) -> A -> [A] -> [A]-{--sortBy          :: (A -> A -> Ordering) -> [A] -> [A]--}-maximumBy       :: (A -> A -> Ordering) -> [A] -> A-minimumBy       :: (A -> A -> Ordering) -> [A] -> A---- * The \"generic\" operations-genericLength           :: [A] -> I-genericTake             :: I -> [A] -> [A]-genericDrop             :: I -> [A] -> [A]-genericIndex            :: [A] -> I -> A-genericSplitAt          :: I -> [A] -> ([A], [A])-genericReplicate        :: I -> A -> [A]--s = Stream.stream-u = Stream.unstream---- * Basic interface-cons            = \x xs  -> u $ Stream.cons   x (s xs)-snoc            = \xs x  -> u $ Stream.snoc   (s xs) x-append          = \xs ys -> u $ Stream.append (s xs) (s ys)-head            = \xs    ->     Stream.head   (s xs)-last            = \xs    ->     Stream.last   (s xs)-tail            = \xs    -> u $ Stream.tail   (s xs)-init            = \xs    -> u $ Stream.init   (s xs)-null            = \xs    ->     Stream.null   (s xs)-length          = \xs    ->     Stream.length (s xs)----- * List transformations-map             = \f   xs -> u $ Stream.map f (s xs)---reverse               = Stream.reverse-intersperse     = \sep xs -> u $ Stream.intersperse sep (s xs)-intercalate     = \sep xs -> Stream.concat (Stream.intersperse sep(s xs))----transpose     = Stream.transpose---- * Reducing lists (folds)-foldl           = \f z xs -> Stream.foldl   f z (s xs)-foldl'          = \f z xs -> Stream.foldl'  f z (s xs)-foldl1          = \f   xs -> Stream.foldl1  f   (s xs)-foldl1'         = \f   xs -> Stream.foldl1' f   (s xs)-foldr           = \f z xs -> Stream.foldr   f z (s xs)-foldr1          = \f   xs -> Stream.foldr1  f   (s xs)---- ** Special folds-concat          = \  xs -> Stream.concat (s xs)-concatMap       = \f xs -> u $ Stream.concatMap (s . f) (s xs)-and             = \  xs -> Stream.and   (s xs)-or              = \  xs -> Stream.or    (s xs)-any             = \f xs -> Stream.any f (s xs)-all             = \f xs -> Stream.all f (s xs)-sum             = \  xs -> Stream.sum   (s xs)-product         = \  xs -> Stream.product   (s xs)-maximum         = \  xs -> Stream.maximum   (s xs)-minimum         = \  xs -> Stream.minimum   (s xs)---- * Building lists--- ** Scans-scanl           = \f z xs -> u (Stream.scanl f z (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--scanl1          = \f xs -> u (Stream.scanl1 f (Stream.snoc (s xs) bottom))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--{--scanr           = \f z xs -> u (Stream.scanr f z (Stream.cons bottom (s xs)))- where-    bottom :: a-    bottom = error "StreamProperties.bottom"--}--{--scanr1          = Stream.scanr1---- ** Accumulating maps-mapAccumL       = Stream.mapAccumL-mapAccumR       = Stream.mapAccumR--}--- ** Infinite lists-iterate         = \f x -> u $ Stream.iterate   f x-repeat          = \  x -> u $ Stream.repeat      x-replicate       = \n x -> u $ Stream.replicate n x-cycle           = \ xs -> u $ Stream.cycle    (s xs)---- ** Unfolding-unfoldr         = \f x -> u $ Stream.unfoldr f x---- * Sublists--- ** Extracting sublists-take            = \n xs -> u $ Stream.take    n (s xs)-drop            = \n xs -> u $ Stream.drop    n (s xs)-splitAt         = \n xs ->     Stream.splitAt n (s xs)-takeWhile       = \f xs -> u $ Stream.takeWhile f (s xs)-dropWhile       = \f xs -> u $ Stream.dropWhile f (s xs)-{--span          = Stream.span-break           = Stream.break-group           = Stream.group-inits           = Stream.inits-tails           = Stream.tails--}---- * Predicates-isPrefixOf      = \xs ys -> Stream.isPrefixOf (s xs) (s ys)-{--isSuffixOf      = Stream.isSuffixOf-isInfixOf       = Stream.isInfixOf--}--- * Searching lists--- ** Searching by equality-elem            = \key xs -> Stream.elem   key (s xs)---notElem               = Stream.notElem-lookup          = \key xs -> Stream.lookup key (s xs)---- ** Searching with a predicate-find            = \p xs ->     Stream.find   p (s xs)-filter          = \p xs -> u $ Stream.filter p (s xs)---partition     = Stream.partition---- * Indexing lists-(!!)            = \xs -> Stream.index (s xs)-findIndex       = \f xs -> Stream.findIndex f (s xs)-elemIndex       = \x xs -> Stream.elemIndex x (s xs)-elemIndices     = \x xs -> u (Stream.elemIndices x (s xs))-findIndices     = \p xs -> u (Stream.findIndices p (s xs))----- * Zipping and unzipping lists-zip  = \xs ys       -> u (Stream.zip (s xs) (s ys))-zip3 = \xs ys zs    -> u (Stream.zip3 (s xs) (s ys) (s zs))-zip4 = \xs ys zs as -> u (Stream.zip4 (s xs) (s ys) (s zs) (s as))--zipWith         = \f xs ys       -> u (Stream.zipWith f (s xs) (s ys))-zipWith3        = \f xs ys zs    -> u (Stream.zipWith3 f (s xs) (s ys) (s zs))-zipWith4        = \f xs ys zs as -> u (Stream.zipWith4 f (s xs) (s ys) (s zs) (s as))--unzip           = Stream.unzip . s--{--zip4            = Stream.zip4-zip5            = Stream.zip5-zip6            = Stream.zip6-zip7            = Stream.zip7-zipWith4        = Stream.zipWith4-zipWith5        = Stream.zipWith5-zipWith6        = Stream.zipWith6-zipWith7        = Stream.zipWith7-unzip3          = Stream.unzip3-unzip4          = Stream.unzip4-unzip5          = Stream.unzip5-unzip6          = Stream.unzip6-unzip7          = Stream.unzip7--}---- * Special lists--- ** Functions on strings---unlines         = \xs -> u (Stream.concatMap (\x -> Stream.snoc (s x) '\n') (s xs))---lines           = \xs -> u (Stream.lines (s xs))--{--words           = Stream.words-unwords         = Stream.unwords---- ** \"Set\" operations-nub             = Stream.nub-delete          = Stream.delete-(\\)            = (Stream.\\)-union           = Stream.union-intersect       = Stream.intersect---- ** Ordered lists -sort            = Stream.sort-insert          = Stream.insert---- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)-nubBy           = Stream.nubBy-deleteBy        = Stream.deleteBy-deleteFirstsBy  = Stream.deleteFirstsBy-unionBy         = Stream.unionBy-intersectBy     = Stream.intersectBy-groupBy         = Stream.groupBy--}---- *** User-supplied comparison (replacing an Ord context)-{--sortBy          = Stream.sortBy--}-insertBy        = \cmp x xs -> u $ Stream.insertBy cmp x (s xs)--maximumBy       = \cmp xs -> Stream.maximumBy cmp (s xs)-minimumBy       = \cmp xs -> Stream.minimumBy cmp (s xs)---- * The \"generic\" operations-genericLength           = \xs -> Stream.genericLength (s xs)-genericTake             = \n xs -> u $ Stream.genericTake n (s xs)-genericDrop             = \n xs -> u $ Stream.genericDrop n (s xs)-genericIndex            = \xs n -> Stream.genericIndex (s xs) n-genericSplitAt          = \n xs -> Stream.genericSplitAt n (s xs)-genericReplicate        = \n x  -> genericTake n (Prelude.repeat x)-
− tests/Strictness/StreamListVsList.hs
@@ -1,391 +0,0 @@------- Must have rules off, otherwise the fusion rules will replace the rhs--- with the lhs, and we only end up testing lhs == lhs-----import Prelude hiding (null)-import Strictness.Utils-import System.IO--import qualified Strictness.Monomorphic.StreamList as Test        -- our stream implementation-import qualified Strictness.Monomorphic.List       as Spec        -- our list implementation------- Data.Stream <=> Data.List.Stream-------------------------------------------------------------------------------- * Basic interface--prop_append     = Test.append   `eq2`           (Spec.++)-prop_head       = Test.head     `eq1`           Spec.head-prop_last       = Test.last     `eq1`           Spec.last-prop_tail       = Test.tail     `eq1`           Spec.tail-prop_init       = Test.init     `eq1`           Spec.init-prop_null       = Test.null     `eq1`           Spec.null-prop_length     = Test.length   `eq1`           Spec.length----------------------------------------------------------------------------- * List transformations--prop_map                = Test.map              `eq2`   Spec.map---prop_reverse            = Test.reverse          `eq1`   Spec.reverse-prop_intersperse        = Test.intersperse      `eq2`   Spec.intersperse-prop_intercalate        = Test.intercalate      `eq2`   Spec.intercalate---prop_transpose          = Test.transpose        `eq1`   Spec.transpose----------------------------------------------------------------------------- * Reducing lists (folds)--prop_foldl      = Test.foldl            `eq3`   Spec.foldl-prop_foldl'     = Test.foldl'           `eq3`   Spec.foldl'-prop_foldl1     = Test.foldl1           `eq2`   Spec.foldl1-prop_foldl1'    = Test.foldl1'          `eq2`   Spec.foldl1'-prop_foldr      = Test.foldr            `eq3`   Spec.foldr-prop_foldr1     = Test.foldr1           `eq2`   Spec.foldr1----------------------------------------------------------------------------- ** Special folds--prop_concat     = Test.concat           `eq1`   Spec.concat-prop_concatMap  = Test.concatMap        `eq2`   Spec.concatMap-prop_and        = Test.and              `eq1`   Spec.and-prop_or         = Test.or               `eq1`   Spec.or-prop_any        = Test.any              `eq2`   Spec.any-prop_all        = Test.all              `eq2`   Spec.all-prop_sum        = Test.sum              `eq1`   Spec.sum-prop_product    = Test.product          `eq1`   Spec.product-prop_maximum    = Test.maximum          `eq1`   Spec.maximum-prop_minimum    = Test.minimum          `eq1`   Spec.minimum----------------------------------------------------------------------------- * Building lists--- ** Scans--prop_scanl      = Test.scanl            `eq3`   Spec.scanl-prop_scanl1     = Test.scanl1           `eq2`   Spec.scanl1---prop_scanr      = Test.scanr            `eq3`   Spec.scanr---prop_scanr1     = Test.scanr1           `eq2`   Spec.scanr1----------------------------------------------------------------------------- ** Accumulating maps----prop_mapAccumL  = Test.mapAccumL        `eq3`   Spec.mapAccumL---prop_mapAccumR  = Test.mapAccumR        `eq3`   Spec.mapAccumR----------------------------------------------------------------------------- ** Infinite lists--prop_iterate    = Test.iterate    `eqfinite2`   Spec.iterate-prop_repeat     = Test.repeat     `eqfinite1`   Spec.repeat-prop_replicate  = Test.replicate  `eqfinite2`   Spec.replicate-prop_cycle      = Test.cycle      `eqfinite1`   Spec.cycle----------------------------------------------------------------------------- ** Unfolding--prop_unfoldr    = Test.unfoldr    `eqfinite2`   Spec.unfoldr----------------------------------------------------------------------------- * Sublists--- ** Extracting sublists--prop_take       = Test.take             `eq2`   Spec.take-prop_drop       = Test.drop             `eq2`   Spec.drop-prop_splitAt    = Test.splitAt          `eq2`   Spec.splitAt-prop_takeWhile  = Test.takeWhile        `eq2`   Spec.takeWhile-prop_dropWhile  = Test.dropWhile        `eq2`   Spec.dropWhile---prop_span       = Test.span             `eq2`   Spec.span---prop_break      = Test.break            `eq2`   Spec.break---prop_group      = Test.group            `eq1`   Spec.group---prop_inits      = Test.inits            `eq1`   Spec.inits---prop_tails      = Test.tails            `eq1`   Spec.tails----------------------------------------------------------------------------- * Predicates--prop_isPrefixOf  = Test.isPrefixOf       `eq2`   Spec.isPrefixOf---prop_isSuffixOf  = Test.isSuffixOf       `eq2`   Spec.isSuffixOf---prop_isInfixOf   = Test.isInfixOf        `eq2`   Spec.isInfixOf----------------------------------------------------------------------------- * Searching lists--- ** Searching by equality--prop_elem       = Test.elem             `eq2`   Spec.elem---prop_notElem    = Test.notElem          `eq2`   Spec.notElem-prop_lookup     = Test.lookup           `eq2`   Spec.lookup----------------------------------------------------------------------------- ** Searching with a predicate--prop_find       = Test.find             `eq2`   Spec.find-prop_filter     = Test.filter           `eq2`   Spec.filter---prop_partition  = Test.partition        `eq2`   Spec.partition----------------------------------------------------------------------------- * Indexing lists--prop_index              = (Test.!!)             `eq2`   (Spec.!!)-prop_elemIndex          = Test.elemIndex        `eq2`   Spec.elemIndex-prop_elemIndices        = Test.elemIndices      `eq2`   Spec.elemIndices-prop_findIndex          = Test.findIndex        `eq2`   Spec.findIndex-prop_findIndices        = Test.findIndices      `eq2`   Spec.findIndices----------------------------------------------------------------------------- * Zipping and unzipping lists--prop_zip        = Test.zip              `eq2`   Spec.zip-prop_zip3       = Test.zip3             `eq3`   Spec.zip3-prop_zip4       = Test.zip4             `eq4`   Spec.zip4---prop_zip5       = Test.zip5             `eq5`   Spec.zip5---prop_zip6       = Test.zip6             `eq6`   Spec.zip6---prop_zip7       = Test.zip7             `eq7`   Spec.zip7-prop_zipWith    = Test.zipWith          `eq3`   Spec.zipWith-prop_zipWith3   = Test.zipWith3         `eq4`   Spec.zipWith3-prop_zipWith4   = Test.zipWith4         `eq5`   Spec.zipWith4---prop_zipWith5   = Test.zipWith5         `eq6`   Spec.zipWith5---prop_zipWith6   = Test.zipWith6         `eq7`   Spec.zipWith6---prop_zipWith7   = Test.zipWith7         `eq8`   Spec.zipWith7----------------------------------------------------------------------------prop_unzip      = Test.unzip            `eq1`   Spec.unzip---prop_unzip3     = Test.unzip3           `eq1`   Spec.unzip3---prop_unzip4     = Test.unzip4           `eq1`   Spec.unzip4---prop_unzip5     = Test.unzip5           `eq1`   Spec.unzip5---prop_unzip6     = Test.unzip6           `eq1`   Spec.unzip6---prop_unzip7     = Test.unzip7           `eq1`   Spec.unzip7----------------------------------------------------------------------------- * Special lists--- ** Functions on strings----prop_lines      = Test.lines            `eq1`   Spec.lines---prop_words      = Test.words            `eq1`   Spec.words---prop_unlines    = Test.unlines          `eq1`   Spec.unlines---prop_unwords    = Test.unwords          `eq1`   Spec.unwords----------------------------------------------------------------------------- ** \"Set\" operations----prop_nub        = Test.nub              `eq1`   Spec.nub---prop_delete     = Test.delete           `eq2`   Spec.delete---prop_difference = (Test.\\)             `eq2`   (Spec.\\)---prop_union      = Test.union            `eq2`   Spec.union---prop_intersect  = Test.intersect        `eq2`   Spec.intersect----------------------------------------------------------------------------- ** Ordered lists ----prop_sort       = Test.sort             `eq1`   Spec.sort---prop_insert     = Test.insert           `eq2`   Spec.insert----------------------------------------------------------------------------- * Generalized functions--- ** The \"By\" operations--- *** User-supplied equality (replacing an Eq context)----prop_nubBy              = Test.nubBy            `eq2`   Spec.nubBy---prop_deleteBy           = Test.deleteBy         `eq3`   Spec.deleteBy---prop_deleteFirstsBy     = Test.deleteFirstsBy   `eq3`   Spec.deleteFirstsBy---prop_unionBy            = Test.unionBy          `eq3`   Spec.unionBy---prop_intersectBy        = Test.intersectBy      `eq3`   Spec.intersectBy---prop_groupBy            = Test.groupBy          `eq2`   Spec.groupBy----------------------------------------------------------------------------- *** User-supplied comparison (replacing an Ord context)----prop_sortBy             = Test.sortBy           `eq2`    Spec.sortBy     --need to generate total orders-prop_insertBy           = Test.insertBy         `eq3`    Spec.insertBy-prop_maximumBy          = Test.maximumBy        `eq2`    Spec.maximumBy-prop_minimumBy          = Test.minimumBy        `eq2`    Spec.minimumBy----------------------------------------------------------------------------- * The \"generic\" operations--prop_genericLength      = Test.genericLength    `eq1`    Spec.genericLength-prop_genericTake        = Test.genericTake      `eq2`    Spec.genericTake-prop_genericDrop        = Test.genericDrop      `eq2`    Spec.genericDrop-prop_genericSplitAt     = Test.genericSplitAt   `eq2`    Spec.genericSplitAt-prop_genericIndex       = Test.genericIndex     `eq2`    Spec.genericIndex-prop_genericReplicate   = Test.genericReplicate `eqfinite2`    Spec.genericReplicate----------------------------------------------------------------------------main = do-  hSetBuffering stdout NoBuffering-  putStrLn "Testing Data.Stream <=> Data.List.Stream"-  putStrLn "========================================\n"-  -  runTests "Basic interface" opts-    [run prop_append-    ,run prop_head-    ,run prop_last-    ,run prop_tail-    ,run prop_init-    ,run prop_null-    ,run prop_length-    ]--  runTests "List transformations" opts-    [run prop_map---    ,run prop_reverse-    ,run prop_intersperse-    ,run prop_intercalate---    ,run prop_transpose-    ]--  runTests "Reducing lists (folds)" opts-    [run prop_foldl-    ,run prop_foldl'-    ,run prop_foldl1-    ,run prop_foldl1'-    ,run prop_foldr-    ,run prop_foldr1-    ]--  runTests "Special folds" opts-    [run prop_concat-    ,run prop_concatMap-    ,run prop_and-    ,run prop_or-    ,run prop_any-    ,run prop_all-    ,run prop_sum-    ,run prop_product-    ,run prop_maximum-    ,run prop_minimum-    ]--  runTests "Scans" opts-    [run prop_scanl-    ,run prop_scanl1---    ,run prop_scanr---    ,run prop_scanr1-    ]--  runTests "Accumulating maps" opts-    [--run prop_mapAccumL---    ,run prop_mapAccumR-    ]--  runTests "Infinite lists" opts-    [run prop_iterate-    ,run prop_repeat-    ,run prop_replicate-    ,run prop_cycle-    ]--  runTests "Unfolding" opts-    [run prop_unfoldr-    ]--  runTests "Extracting sublists" opts-    [run prop_take-    ,run prop_drop-    ,run prop_splitAt-    ,run prop_takeWhile-    ,run prop_dropWhile---    ,run prop_span---    ,run prop_break---    ,run prop_group---    ,run prop_inits---    ,run prop_tails-    ]--  runTests "Predicates" opts-    [run prop_isPrefixOf---    ,run prop_isSuffixOf---    ,run prop_isInfixOf-    ]--  runTests "Searching by equality" opts-    [run prop_elem---    ,run prop_notElem-    ,run prop_lookup-    ]--  runTests "Searching by a predicate" opts-    [run prop_find-    ,run prop_filter---    ,run prop_partition-    ]--  runTests "Indexing lists" opts-    [run prop_index-    ,run prop_elemIndex-    ,run prop_elemIndices-    ,run prop_findIndex-    ,run prop_findIndices-    ]--  runTests "Zipping" opts { testDepth = 6, maxTests = 100000 }-    [run prop_zip-    ,run prop_zip3-    ,run prop_zip4---    ,run prop_zip5---    ,run prop_zip6---    ,run prop_zip7-    ,run prop_zipWith-    ,run prop_zipWith3-    ,run prop_zipWith4---    ,run prop_zipWith5---    ,run prop_zipWith6---    ,run prop_zipWith7-    ]--  runTests "Unzipping" opts-    [run prop_unzip---    ,run prop_unzip3---    ,run prop_unzip4---    ,run prop_unzip5---    ,run prop_unzip6---    ,run prop_unzip7-    ]----  runTests "Functions on strings" opts---    [run prop_lines---    ,run prop_words---    ,run prop_unlines---    ,run prop_unwords---    ]--  runTests "\"Set\" operations" opts-    [--run prop_nub-    --,run prop_delete-    --,run prop_difference-    --,run prop_union-    --,run prop_intersect-    ]--  runTests "Ordered lists" opts-    [--run prop_sort---    ,run prop_insert-    ]--  runTests "Eq style \"By\" operations" opts-    [--run prop_nubBy---    ,run prop_deleteBy---    ,run prop_deleteFirstsBy---    ,run prop_unionBy---    ,run prop_intersectBy---    ,run prop_groupBy-    ]--  runTests "Ord style \"By\" operations" opts-    [--run prop_sortBy        -- note issue here.-    run prop_insertBy-    ,run prop_maximumBy-    ,run prop_minimumBy-    ]--  runTests "The \"generic\" operations" opts-    [run prop_genericLength-    ,run prop_genericTake-    ,run prop_genericDrop-    ,run prop_genericSplitAt-    ,run prop_genericIndex-    ,run prop_genericReplicate-    ]
− tests/Strictness/Utils.hs
@@ -1,74 +0,0 @@-module Strictness.Utils (-  module Strictness.Utils,-  module Test.SmallCheck.Partial-  ) where--import Prelude hiding (null)-import qualified Prelude--import Test.SmallCheck.Partial hiding (PositiveIntegral(N))-import Test.ChasingBottoms-import Data.Generics---- some types to use when testing at polymorphic values--newtype A = A () deriving (Eq, Show, Serial, Typeable, Data)-newtype B = B () deriving (Eq, Show, Serial, Typeable, Data)-newtype C = C () deriving (Eq, Show, Serial, Typeable, Data)--type D = A-type E = B-type F = C-type G = A-type H = B--newtype OrdA = OrdA Bool deriving (Eq, Ord, Show, Serial, Typeable, Data)--newtype N = N Int deriving (Eq, Ord, Show, Serial, Typeable, Data)-newtype I = I Int deriving (Eq, Ord, Enum, Real, Integral, Show, Serial, Typeable, Data)---- to catch cases where we rely on associativity or comutativity of--- (+) or (*)... make them neither! Mwahahaha :-)--instance Num N where-  N x + N y = N (2 * x + y)-  N x * N y = N (2 * x + y + 1)-  fromInteger = N . fromInteger-  negate (N n) = N (negate n)-  abs (N n) = N (abs n)-  signum (N n) = N (signum n)--instance Num I where-  I x + I y = I (2 * x + y)-  I x * I y = I (2 * x + y + 1)-  fromInteger = I . fromInteger-  negate (I i) = I (negate i)-  abs (I i) = I (abs i)-  signum (I i) = I (signum i)---eq1 f g = \x               -> f x               ==! g x-eq2 f g = \x y             -> f x y             ==! g x y-eq3 f g = \x y z           -> f x y z           ==! g x y z-eq4 f g = \x y z a         -> f x y z a         ==! g x y z a-eq5 f g = \x y z a b       -> f x y z a b       ==! g x y z a b-eq6 f g = \x y z a b c     -> f x y z a b c     ==! g x y z a b c-eq7 f g = \x y z a b c d   -> f x y z a b c d   ==! g x y z a b c d-eq8 f g = \x y z a b c d e -> f x y z a b c d e ==! g x y z a b c d e--eqfinite1 f g = \x         -> semanticEq limit (f x)   (g x)-eqfinite2 f g = \x y       -> semanticEq limit (f x y) (g x y)--limit = Tweak { approxDepth = Just 1000, timeOutLimit = Nothing }---refines1 f g = \x               -> f x               >=! g x-refines2 f g = \x y             -> f x y             >=! g x y-refines3 f g = \x y z           -> f x y z           >=! g x y z-refines4 f g = \x y z a         -> f x y z a         >=! g x y z a-refines5 f g = \x y z a b       -> f x y z a b       >=! g x y z a b-refines6 f g = \x y z a b c     -> f x y z a b c     >=! g x y z a b c-refines7 f g = \x y z a b c d   -> f x y z a b c d   >=! g x y z a b c d-refines8 f g = \x y z a b c d e -> f x y z a b c d e >=! g x y z a b c d e--opts = TestOptions 8 10000
− tests/Test/SmallCheck/Partial.hs
@@ -1,527 +0,0 @@-{-# OPTIONS_GHC -fallow-incoherent-instances -fallow-undecidable-instances #-}-------------------------------------------------------------------------- SmallCheck: another lightweight testing library.--- Colin Runciman, August 2006--- Version 0.2 (November 2006)------ After QuickCheck, by Koen Claessen and John Hughes (2000-2004).------------------------------------------------------------------------module Test.SmallCheck.Partial (-  smallCheck, smallCheckI, depthCheck, test,-  Property, Testable,-  forAll, forAllElem,-  exists, existsDeeperBy, thereExists, thereExistsElem,-  (==>),-  Series, Serial(..),-  (\/), (><), two, three, four,-  cons0, cons1, cons2, cons3, cons4,-  alts0, alts1, alts2, alts3, alts4,-  PositiveIntegral(..), Nat, Natural,-  depth, inc, dec,-  -  run, runTests, TestOptions(..)-  ) where--import List (intersperse)-import Monad (when)-import IO (stdout, hFlush)-import Foreign (unsafePerformIO)  -- used only for Testable (IO a)--import qualified Test.ChasingBottoms as Bottoms-------------------- <Series of depth-bounded values> --------------------- Series arguments should be interpreted as a depth bound (>=0)--- Series results should have finite length--type Series a = Int -> [a]---- sum-infixr 7 \/-(\/) :: Series a -> Series a -> Series a-(s1 \/ s2) 0 = bottom : []-(s1 \/ s2) d = bottom : s1 (d-1) ++ s2 (d-1)---- product-infixr 8 ><-(><) :: Series a -> Series b -> Series (a,b)-(s1 >< s2) 0 = bottom : []-(s1 >< s2) d = bottom : [(x,y) | x <- s1 (d-1), y <- s2 (d-1)]---------------------- <methods for type enumeration> ---------------------- enumerated data values should be finite and fully defined--- enumerated functional values should be total and strict--bottom :: a-bottom = error "_|_"---- bounds:--- for data values, the depth of nested constructor applications--- for functional values, both the depth of nested case analysis--- and the depth of results- -class Serial a where-  series   :: Series a-  coseries :: Serial b => Series (a->b)--instance Serial () where-  series   d = take (d+1) [bottom, ()]-  coseries d = [ \() -> b-               | b <- series d ]--instance Serial Int where-  series   d = seq 0-    where seq n | n > d = []-          seq n@0       = bottom         : seq (n+1)-          seq n@1       = 0              : seq (n+1)-          seq n         = -(n-1) : (n-1) : seq (n+1)-  coseries d = [ \i -> if i > 0 then f (N (i - 1))-                       else if i < 0 then g (N (abs i - 1))-                       else z-               | z <- alts0 d, f <- alts1 d, g <- alts1 d ]--instance Serial Integer where-  series   d = [ toInteger (i :: Int)-               | i <- series d ]-  coseries d = [ f . (fromInteger :: Integer->Int)-               | f <- series d ]--newtype PositiveIntegral a = N a--instance Show a => Show (PositiveIntegral a) where-  show (N i) = show i--instance (Integral a, Serial a) => Serial (PositiveIntegral a) where-  series   d = map N [0..d']-               where-               d' = fromInteger (toInteger d)-  coseries d = [ \(N i) -> if i > 0 then f (N (i - 1))-                           else z-               | z <- alts0 d, f <- alts1 d ]--type Nat = PositiveIntegral Int-type Natural = PositiveIntegral Integer--instance Serial Float where-  series d   = [ encodeFloat sig exp-               | (sig,exp) <- series d,-                 odd sig || sig==0 && exp==0 ]-  coseries d = [ f . decodeFloat-               | f <- series d ]-             -instance Serial Double where-  series   d = [ frac (x :: Float)-               | x <- series d ]-  coseries d = [ f . (frac :: Double->Float)-               | f <- series d ]--frac :: (Real a, Fractional a, Real b, Fractional b) => a -> b-frac = fromRational . toRational--instance Serial Char where-  series d   = take (d+1) " \nab\0cd,ef"-  coseries d = [ \c -> f (N (fromEnum c - fromEnum 'a'))-               | f <- series d ]--instance (Serial a, Serial b) =>-         Serial (a,b) where-  series   = series >< series-  coseries = map uncurry . coseries--instance (Serial a, Serial b, Serial c) =>-         Serial (a,b,c) where-  series   = \d -> bottom-                 : [ (x,y,z)-                   | x <- series (d-1)-                   , y <- series (d-1)-                   , z <- series (d-1)]-  coseries = map uncurry3 . coseries--instance (Serial a, Serial b, Serial c, Serial d) =>-         Serial (a,b,c,d) where-  series   = \d -> bottom-                 : [ (x,y,z,a)-                   | x <- series (d-1)-                   , y <- series (d-1)-                   , z <- series (d-1)-                   , a <- series (d-1)]-  coseries = map uncurry4 . coseries--uncurry3 :: (a->b->c->d) -> ((a,b,c)->d)-uncurry3 f (x,y,z) = f x y z--uncurry4 :: (a->b->c->d->e) -> ((a,b,c,d)->e)-uncurry4 f (w,x,y,z) = f w x y z--two   :: Series a -> Series (a,a)-two   s = s >< s--three :: Series a -> Series (a,a,a)-three s = \d -> [(x,y,z) | (x,(y,z)) <- (s >< s >< s) d]--four  :: Series a -> Series (a,a,a,a)-four  s = \d -> [(w,x,y,z) | (w,(x,(y,z))) <- (s >< s >< s >< s) d]--cons0 :: -         a -> Series a-cons0 c _ = [c]--cons1 :: Serial a =>-         (a->b) -> Series b-cons1 c d = [c z | d > 0, z <- series (d-1)]--cons2 :: (Serial a, Serial b) =>-         (a->b->c) -> Series c-cons2 c d = [c y z | d > 0, y <- series (d-1), z <- series (d-1)]--cons3 :: (Serial a, Serial b, Serial c) =>-         (a->b->c->d) -> Series d-cons3 c d = [c x y z | d > 0, (x,y,z) <- series (d-1)]--cons4 :: (Serial a, Serial b, Serial c, Serial d) =>-         (a->b->c->d->e) -> Series e-cons4 c d = [c w x y z | d > 0, (w,x,y,z) <- series (d-1)]--alts0 ::  Serial a =>-            Series a-alts0 d = series d--alts1 ::  (Serial a, Serial b) =>-            Series (a->b)-alts1 d = if d > 0 then series (dec d)-          else [\_ -> x | x <- series d]--alts2 ::  (Serial a, Serial b, Serial c) =>-            Series (a->b->c)-alts2 d = if d > 0 then series (dec d)-          else [\_ _ -> x | x <- series d]--alts3 ::  (Serial a, Serial b, Serial c, Serial d) =>-            Series (a->b->c->d)-alts3 d = if d > 0 then series (dec d)-          else [\_ _ _ -> x | x <- series d]--alts4 ::  (Serial a, Serial b, Serial c, Serial d, Serial e) =>-            Series (a->b->c->d->e)-alts4 d = if d > 0 then series (dec d)-          else [\_ _ _ _ -> x | x <- series d]--instance Serial Bool where-  series     = cons0 False \/ cons0 True-  coseries d = [ \x -> if x then b1 else b2-               | b1 <- series d, b2 <- series d ]--instance Serial Ordering where-  series     = cons0 EQ \/ cons0 LT \/ cons0 GT-  coseries d = [ \m -> case m of-                       LT -> x-                       EQ -> y-                       GT -> z-               |  x <- alts0 d ,-                  y <- alts0 d ,-                  z <- alts0 d ]--instance Serial a => Serial (Maybe a) where-  series     = cons0 Nothing \/ cons1 Just-  coseries d = [ \m -> case m of-                       Nothing -> z-                       Just x  -> f x-               |  z <- alts0 d ,-                  f <- alts1 d ]--instance (Serial a, Serial b) => Serial (Either a b) where-  series     = cons1 Left \/ cons1 Right-  coseries d = [ \e -> case e of-                       Left x  -> f x-                       Right y -> g y-               |  f <- alts1 d ,-                  g <- alts1 d ]--instance Serial a => Serial [a] where-  series     = cons0 [] \/ cons2 (:)-  coseries d = [ \xs -> case xs of-                        []      -> y-                        (x:xs') -> f x xs'-               |   y <- alts0 d ,-                   f <- alts2 d ]---- Warning: the coseries instance here may generate duplicates.-instance (Serial a, Serial b) => Serial (a->b) where-  series 0     = bottom : []-  series (d+1) = bottom : [ \_ -> x | x <- series d ] ++ tail (coseries d)-  coseries d = [ \f -> g [f x | x <- series d]-               | g <- series d ]---- For customising the depth measure.  Use with care!--depth :: Int -> Int -> Int-depth d d' | d >= 0    = d'+1-d-           | otherwise = error "SmallCheck.depth: argument < 0"--dec :: Int -> Int-dec d | d > 0     = d-1-      | otherwise = error "SmallCheck.dec: argument <= 0"--inc :: Int -> Int-inc d = d+1-{---- show the extension of a function (in part, bounded both by--- the number and depth of arguments)-instance (Serial a, Show a, Show b) => Show (a->b) where-  show f = -    if maxarheight == 1-    && sumarwidth + length ars * length "->;" < widthLimit then-      "{"++(-      concat $ intersperse ";" $ [a++"->"++r | (a,r) <- ars]-      )++"}"-    else-      concat $ [a++"->\n"++indent r | (a,r) <- ars]-    where-    ars = take lengthLimit [ (show x, show (f x))-                           | x <- series depthLimit ]-    maxarheight = maximum  [ max (height a) (height r)-                           | (a,r) <- ars ]-    sumarwidth = sum       [ length a + length r -                           | (a,r) <- ars]-    indent = unlines . map ("  "++) . lines-    height = length . lines-    (widthLimit,lengthLimit,depthLimit) = (80,20,3)::(Int,Int,Int)--}-instance (Serial a, Bottoms.ApproxShow a, Bottoms.ApproxShow b) => Show (a->b) where-  show f-    | Bottoms.isBottom f = "_|_"-    | otherwise =-    if maxarheight == 1-    && sumarwidth + length ars * length "->;" < widthLimit then-      "{"++(-      concat $ intersperse ";" $ [a++"->"++r | (a,r) <- ars]-      )++"}"-    else-      concat $ [a++"->\n"++indent r | (a,r) <- ars]-    where-    ars = take lengthLimit [ (Bottoms.approxShow 1000 x, Bottoms.approxShow 1000 (f x))-                           | x <- series depthLimit ]-    maxarheight = maximum  [ max (height a) (height r)-                           | (a,r) <- ars ]-    sumarwidth = sum       [ length a + length r -                           | (a,r) <- ars]-    indent = unlines . map ("  "++) . lines-    height = length . lines-    (widthLimit,lengthLimit,depthLimit) = (80,20,3)::(Int,Int,Int)------------------- <properties and their evaluation> ---------------------- adapted from QuickCheck originals: here results come in lists,--- properties have depth arguments, stamps (for classifying random--- tests) are omitted, existentials are introduced--newtype PR = Prop [Result]--data Result = Result {ok :: Maybe Bool, arguments :: [String]}--nothing :: Result-nothing = Result {ok = Nothing, arguments = []}--result :: Result -> PR-result res = Prop [res]--newtype Property = Property (Int -> PR)--class Testable a where-  property :: a -> Int -> PR--instance Testable Bool where-  property b _ = Prop [Result (Just b) []]--instance Testable PR where-  property prop _ = prop--instance (Serial a, Bottoms.ApproxShow a, Testable b) => Testable (a->b) where-  property f = f' where Property f' = forAll series f--instance Testable Property where-  property (Property f) d = f d---- For testing properties involving IO.  Unsafe, so use with care!-instance Testable a => Testable (IO a) where-  property = property . unsafePerformIO--evaluate :: Testable a => a -> Series Result-evaluate x d = rs where Prop rs = property x d--forAll :: (Bottoms.ApproxShow a, Testable b) => Series a -> (a->b) -> Property-forAll xs f = Property $ \d -> Prop $-  [ r{arguments = Bottoms.approxShow 1000 x : arguments r}-  | x <- xs d, r <- evaluate (f x) d ]--forAllElem :: (Bottoms.ApproxShow a, Testable b) => [a] -> (a->b) -> Property-forAllElem xs = forAll (const xs)--thereExists :: Testable b => Series a -> (a->b) -> Property-thereExists xs f = Property $ \d -> Prop $-  [ Result-      ( Just $ or [ all pass (evaluate (f x) d)-                  | x <- xs d ] )-      [] ] -  where-  pass (Result Nothing _)  = True-  pass (Result (Just b) _) = b--thereExistsElem :: Testable b => [a] -> (a->b) -> Property-thereExistsElem xs = thereExists (const xs)--exists :: (Serial a, Testable b) =>-            (a->b) -> Property-exists = thereExists series--existsDeeperBy :: (Serial a, Testable b) =>-                    (Int->Int) -> (a->b) -> Property-existsDeeperBy f = thereExists (series . f)- -infixr 0 ==>--(==>) :: Testable a => Bool -> a -> Property-True ==>  x = Property (property x)-False ==> x = Property (const (result nothing))----------------------- <top-level test drivers> -------------------------- similar in spirit to QuickCheck but with iterative deepening--test :: Testable a => a -> IO ()-test = smallCheckI---- test for values of depths 0..d stopping when a property--- fails or when it has been checked for all these values-smallCheck :: Testable a => Int -> a -> IO ()-smallCheck d = iterCheck 0 (Just d)---- interactive variant, asking the user whether testing should--- continue/go deeper after a failure/completed iteration-smallCheckI :: Testable a => a -> IO ()-smallCheckI = iterCheck 0 Nothing--depthCheck :: Testable a => Int -> a -> IO ()-depthCheck d = iterCheck d (Just d)--iterCheck :: Testable a => Int -> Maybe Int -> a -> IO ()-iterCheck dFrom mdTo t = iter dFrom-  where-  iter d = do-    putStrLn ("Depth "++show d++":")-    let Prop results = property t d-    ok <- check (mdTo==Nothing) 0 0 True results-    maybe (whenUserWishes "  Deeper" () $ iter (d+1))-          (\dTo -> when (ok && d < dTo) $ iter (d+1))-          mdTo--check :: Bool -> Int -> Int -> Bool -> [Result] -> IO Bool-check i n x ok rs | null rs = do-  putStr ("  Completed "++show n++" test(s)")-  putStrLn (if ok then " without failure." else ".")-  when (x > 0) $-    putStrLn ("  But "++show x++" did not meet ==> condition.")-  return ok-check i n x ok (Result Nothing _ : rs) = do-  progressReport i n x-  check i (n+1) (x+1) ok rs-check i n x f (Result (Just True) _ : rs) = do-  progressReport i n x-  check i (n+1) x f rs-check i n x f (Result (Just False) args : rs) = do-  putStrLn ("  Failed test no. "++show (n+1)++". Test values follow.")-  mapM_ (putStrLn . ("  "++)) args-  ( if i then-      whenUserWishes "  Continue" False $ check i (n+1) x False rs-    else-      return False )--whenUserWishes :: String -> a -> IO a -> IO a-whenUserWishes wish x action = do-  putStr (wish++"? ")-  hFlush stdout-  reply <- getLine-  ( if (null reply || reply=="y") then action-    else return x )--progressReport :: Bool -> Int -> Int -> IO ()-progressReport i n x | n >= x = do-  when i $ ( putStr (n' ++ replicate (length n') '\b') >>-             hFlush stdout )-  where-  n' = show n---run :: Testable a => a -> Property-run p = Property (property p)--data TestResult = TestOk        Int-                | TestExhausted Int-                | TestFailed    Int [String]--data TestOptions = TestOptions {-                     testDepth :: Int,-                     maxTests  :: Int-                   }--runTest :: TestOptions -> Property -> TestResult-runTest TestOptions { testDepth = depth, maxTests = max } p =-  let Prop results = property p depth-   in check 0 results-  -  where check n _ | n >= max                    = TestExhausted n-        check n                             []  = TestOk n-        check n (Result Nothing      _    : rs) = check (n+1) rs-        check n (Result (Just True ) _    : rs) = check (n+1) rs-        check n (Result (Just False) args : rs) = TestFailed n args-  --runTests :: String -> TestOptions -> [Property] -> IO ()-runTests name opts props =--  do putStr (rjustify 25 name ++ " : ")-     failures <- tr 1 props [] 0-     mapM fa (reverse failures)-     return ()-  where-	rjustify n s = replicate (max 0 (n - length s)) ' ' ++ s--	tr n [] xs c = do-			putStr (rjustify (max 0 (35-n)) " (" ++ show c ++ ")\n")-			return xs-	tr n (prop:props) failures c = -	   case runTest opts prop of-		TestOk m-			-> do { putStr "." ;-			       tr (n+1) props failures (c+m) }-		TestExhausted m-			-> do { putStr "?" ;-			       tr (n+1) props failures (c+m) }-	  	TestFailed m args-			-> do { putStr "#" ;-			        tr (n+1) props ((args,n,m):failures) c }--	fa :: ([String],Int,Int) -> IO ()-	fa (f,n,m) = -	  do putStr "\n"-	     putStr ("    ** test " -			++ show (n  :: Int)-			++ " of "-			++ name-			++ " failed (after " ++ show m ++ " steps) with the binding(s)\n")-	     sequence_ [putStr ("    **   " ++ v ++ "\n")-			| v <- f ]-  	     putStr "\n"--------------------------------------------------------------------------------- foldl'--- lines too strict--- structure of domain, insert bottoms in correct position.---