{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE PatternSynonyms #-}
module EADT
( testsEADT
)
where
import Test.Tasty
import Test.Tasty.QuickCheck as QC
import Haskus.Utils.EADT
import Haskus.Utils.EADT.TH
data ConsF a l = ConsF a l deriving (Functor)
data NilF l = NilF deriving (Functor)
eadtPattern 'ConsF "Cons"
eadtPattern 'NilF "Nil"
eadtInfixPattern 'ConsF ":->"
type List a = EADT '[ConsF a, NilF]
list0 :: List String
list0 = Cons "Hello" $ Cons "World" Nil
testsEADT :: TestTree
testsEADT = testGroup "EADT" $
[ testProperty "eadtPattern: match" $ case list0 of
Cons (x :: String) _ -> x == "Hello"
_ -> False
, testProperty "eadtInfixPattern: match" $ case list0 of
(x :: String) :-> _ -> x == "Hello"
_ -> False
]