{-# LANGUAGE RankNTypes #-}
{- |
Module : Main
Description : Property tests
Copyright : (c) Ivan Lazar Miljenovic
License : MIT
Maintainer : Ivan.Miljenovic@gmail.com
-}
module Main (main) where
import Control.Quiver.Interleave
import Control.Quiver.SP
import Data.Functor.Identity
import Data.List (sort)
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck
--------------------------------------------------------------------------------
main :: IO ()
main = hspec $
describe "interleave" $ do
prop "same as list-based" $
forAllShrink orderedSubLists shrink $ \ass ->
interleaveSort ass == sort (concat ass)
it "propagates errors" $
spIdentity (spinterleave compare [spevery [1,4,7]
,spevery [2,5,8]
,3 >:> spfailed "failed"]
>->> spToList)
== (SPFailed "failed", [1,2,3] :: [Int]) -- The error and the values found before the error came up.
spToList :: SQ a x f [a]
spToList = spfoldr (:) []
spIdentity :: SQ a b Identity c -> c
spIdentity = runIdentity . sprun
-- Assumes each sub-list is ordered.
interleaveSort :: (Ord a) => [[a]] -> [a]
interleaveSort ass = spIdentity (spinterleave compare (map spevery ass) >->> spToList >&> snd)
-- Each sub-list is ordered
orderedSubLists :: Gen [[Int]]
orderedSubLists = listOf orderedList