{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module BaseSpec.BasicSpecBase (basicSpec) where

import Parrows.Definition
import Parrows.Future

import Control.Arrow()

import Test.Hspec
import Test.Hspec.QuickCheck

basicSpec :: (ArrowParallel (->) Int Int (),
  Future fut Int (), ArrowParallel (->) (fut Int) (fut Int) (),
  ArrowParallel (->) (Either Int Int) (Either Int Int) ()) => Spec
basicSpec = describe "Basic Functionality Check" $ do
    prop "Basic parEvalN" $ basicParEvalN
    prop "parEvalNLazy" $ parEvalNLazyInt
    prop "parEvalNFut" $ parEvalNFutInt
    prop "parEval2" $ parEval2Int
     where
        basicParEvalN :: [Int] -> Bool
        basicParEvalN xs = parEvalN () (repeat (+1)) xs == map (+1) xs

        parEvalNLazyInt :: [Int] -> Bool
        parEvalNLazyInt xs = parEvalNLazy () 4 (repeat (+1)) xs == map (+1) xs

        parEvalNFutInt :: [Int] -> Bool
        parEvalNFutInt xs = (map (get ()) (parEvalNFut () (repeat (+1)) (map (put ()) xs))) == map (+1) xs

        parEval2Int :: (Int, Int) -> Bool
        parEval2Int (x, y) = (parEval2 () (+1) (*2) (x, y)) == (x+1,y*2)