Blame examples/Merge.hs

Packit 1d8052
{-# LANGUAGE ScopedTypeVariables, TemplateHaskell #-}
Packit 1d8052
module Main where
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- imports
Packit 1d8052
Packit 1d8052
import Test.QuickCheck
Packit 1d8052
Packit 1d8052
import Data.List
Packit 1d8052
  ( sort
Packit 1d8052
  )
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- merge sort
Packit 1d8052
Packit 1d8052
msort :: Ord a => [a] -> [a]
Packit 1d8052
msort xs = merging [ [x] | x <- xs ]
Packit 1d8052
Packit 1d8052
merging :: Ord a => [[a]] -> [a]
Packit 1d8052
merging []   = []
Packit 1d8052
merging [xs] = xs
Packit 1d8052
merging xss  = merging (sweep xss)
Packit 1d8052
Packit 1d8052
sweep :: Ord a => [[a]] -> [[a]]
Packit 1d8052
sweep []          = []
Packit 1d8052
sweep [xs]        = [xs]
Packit 1d8052
sweep (xs:ys:xss) = merge xs ys : sweep xss
Packit 1d8052
Packit 1d8052
merge :: Ord a => [a] -> [a] -> [a]
Packit 1d8052
merge xs     []     = xs
Packit 1d8052
merge []     ys     = ys
Packit 1d8052
merge (x:xs) (y:ys)
Packit 1d8052
  | x <= y          = x : merge xs (y:ys)
Packit 1d8052
  | otherwise       = y : merge (x:xs) ys
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- example properties
Packit 1d8052
Packit 1d8052
ordered :: Ord a => [a] -> Bool
Packit 1d8052
ordered []       = True
Packit 1d8052
ordered [x]      = True
Packit 1d8052
ordered (x:y:xs) = x <= y && ordered (y:xs)
Packit 1d8052
Packit 1d8052
prop_Merge xs (ys :: [Int]) =
Packit 1d8052
  ordered xs && ordered ys ==>
Packit 1d8052
    collect (length xs + length ys) $
Packit 1d8052
    ordered (xs `merge` ys)
Packit 1d8052
Packit 1d8052
--  collect (sort [length xs, length ys]) $
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- quantificiation
Packit 1d8052
Packit 1d8052
--prop_Merge (Ordered xs) (Ordered (ys :: [Int])) =
Packit 1d8052
--  ordered (xs `merge` ys)
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
--  classify (length xs `min` length ys >= 5) "not trivial" $
Packit 1d8052
--  cover (length xs `min` length ys >= 5) 70 "not trivial" $
Packit 1d8052
Packit 1d8052
{-
Packit 1d8052
  shrink (Ordered xs) =
Packit 1d8052
    [ Ordered xs'
Packit 1d8052
    | xs' <- shrink xs
Packit 1d8052
    , ordered xs'
Packit 1d8052
    ]
Packit 1d8052
-}
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- merging
Packit 1d8052
Packit 1d8052
prop_Merging (xss :: [OrderedList Int]) =
Packit 1d8052
  ordered (merging [ xs | Ordered xs <- xss ])
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
Packit 1d8052
--  mapSize (`div` 2) $ \(xss :: [OrderedList Int]) ->
Packit 1d8052
Packit 1d8052
return []
Packit 1d8052
main = $quickCheckAll
Packit 1d8052
Packit 1d8052
--------------------------------------------------------------------------
Packit 1d8052
-- the end.