{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
module Main(main) where
import Data.Functor.Classes ( Eq2, Eq1 )
import Data.Bifunctor ( Bifunctor(..) )
import Data.Bimatchable ( Bimatchable )
import Data.Matchable ( Matchable )
import Data.Matchable.TH ( deriveInstances )
main :: IO ()
main = putStrLn "compiles"
-- Most simple case
data F a = F0 | F1 a | F2 a a
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Eq1 F
deriving instance Matchable F
|]
-- Test case for using [] and tuples
newtype G a = G [(a, Int, a)]
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Eq1 G
deriving instance Matchable G
|]
-- Test case for extra type variable
data H a b = H0 a | H1 a b | H2 [Either a b]
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Eq a => Eq1 (H a)
deriving instance Eq a => Matchable (H a)
|]
-- Test case for using Matchable and Bimatchable
data I a b = I a (F b) (Either [b] (a,b))
deriving (Show, Eq)
instance Functor (I a) where
fmap f (I a fb e) = I a (f <$> fb) (bimap (fmap f) (fmap f) e)
deriveInstances [d|
deriving instance Eq a => Eq1 (I a)
deriving instance Eq a => Matchable (I a)
|]
-- Test case for recursive type
data J a = J0 | J1 (J a, Int) a (Int, J a)
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Eq1 J
deriving instance Matchable J
|]
-------------------------------
-- Most simple case
data BiF a b = BiF0 | BiF1 a b
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Bifunctor BiF
deriving instance Eq a => Eq1 (BiF a)
deriving instance Eq a => Matchable (BiF a)
deriving instance Eq2 BiF
deriving instance Bimatchable BiF
|]
-- Test case for using [], tuple, and another Bimatchable instance
data BiG a b = BiG0 | BiG1 [a] [b] | BiG2 (Int, BiF a b)
deriving (Show, Eq, Functor)
deriveInstances [d|
deriving instance Bifunctor BiG
deriving instance Eq a => Eq1 (BiG a)
deriving instance Eq a => Matchable (BiG a)
deriving instance Eq2 BiG
deriving instance Bimatchable BiG
|]
-- Test case for recursive type
data BiH a b = BiH1 a b | BiH2 (BiH b a) (BiH a String)
deriving (Show, Eq)
deriveInstances [d|
deriving instance Bifunctor BiH
deriving instance Eq a => Eq1 (BiH a)
deriving instance Eq a => Matchable (BiH a)
deriving instance Eq2 BiH
deriving instance Bimatchable BiH
|]
instance Functor (BiH a) where
fmap = second