{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances, ConstraintKinds, UndecidableInstances #-}
{-# LANGUAGE TypeApplications #-}
import Test.Tasty
import Test.Tasty.HUnit
import Data.Generics.Traversable
import Data.Generics.Traversable.Zipper
import Data.Generics.Traversable.TH
data User a = User
{ name :: String
, age :: Int
, misc :: a
} deriving Show
alice :: User (Bool, Int)
alice = User "Alice" 22 (True, 12)
deriveGTraversable ''User
class U a
instance U a
main = defaultMain $ testGroup "Tests"
[ testCase "size via gfoldl'" $
gfoldl' @U (\a x -> a+1) 0 alice @?= 3
, testCase "show immediate children via gfoldMap" $
gfoldMap @Show (pure . show) alice @?= ["\"Alice\"","22","(True,12)"]
, testCase "show all children via everything" $
-- don't copy-paste this code; it's quadratic!
everything @Show (++) (pure . show) alice @?=
["User {name = \"Alice\", age = 22, misc = (True,12)}","\"Alice\"","'A'","'l'","'i'","'c'","'e'","22","(True,12)","True","12"]
, testCase "A zipper walk" $ do
let z0 = toZipper @Show alice
let Just z1 = down' z0 -- down' moves to the leftmost child
query show z1 @?= "\"Alice\""
let Just z2 = right z1
query show z2 @?= "22"
let Just z3 = down =<< right z2 -- down moves to the rightmost child
query show z3 @?= "12"
let Just z4 = left z3 -- down moves to the rightmost child
query show z4 @?= "True"
]