Implement Refl in deriveNT
[nt-coerce.git] / test.hs
1 {-# OPTIONS_GHC -fplugin GHC.NT.Plugin #-}
2
3 import GHC.NT
4
5 listNT :: NT a b -> NT [a] [b]
6 listNT = deriveThisNT
7
8 newtype Age = Age Int deriving Show
9
10 ageNT :: NT Age Int
11 ageNT = deriveThisNT
12
13 newtype MyList a = MyList [a] deriving Show
14
15 myListNT :: NT (MyList a) [a]
16 myListNT = deriveThisNT
17
18 foo :: NT a b -> NT (MyList a) (MyList b)
19 foo = deriveThisNT
20
21 newtype R a = R [R a] deriving Show
22
23 rNT :: NT (R a) [R a]
24 rNT = deriveThisNT
25
26 -- Would not work (but is removed anyways before it is seen by GHC.NT.Plugin)
27 bar :: NT (MyList Age) [Int]
28 bar = deriveThisNT
29
30 data F a b c = F a b c deriving Show
31
32 fNT :: NT a a' -> NT (F a b c) (F a' b c)
33 fNT = deriveThisNT
34
35 main = do
36     let n = 1 :: Int
37     let a = coerce (sym ageNT) 1
38     let l1 = [a]
39     let l2 = coerce (listNT ageNT) l1
40     let l3 = coerce (sym myListNT) l2
41     print a
42     print l2
43     print l3
44     print $ coerce (foo (sym ageNT)) l3
45     --print $ coerce bar (MyList [a])
46     print $ coerce (sym rNT) []
47     print $ coerce (fNT (sym ageNT)) (F 1 2 3)
48