summaryrefslogtreecommitdiff
path: root/testsuite/tests/indexed-types/should_compile/T4160.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/indexed-types/should_compile/T4160.hs')
-rw-r--r--testsuite/tests/indexed-types/should_compile/T4160.hs18
1 files changed, 18 insertions, 0 deletions
diff --git a/testsuite/tests/indexed-types/should_compile/T4160.hs b/testsuite/tests/indexed-types/should_compile/T4160.hs
new file mode 100644
index 0000000000..f13aafa103
--- /dev/null
+++ b/testsuite/tests/indexed-types/should_compile/T4160.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, TypeFamilies #-}
+module Foo where
+
+data P f g r = f r :*: g r
+type family TrieMapT (f :: * -> *) :: * -> (* -> *) -> * -> *
+newtype PMap m1 (m2 :: * -> (* -> *) -> * -> *) k (a :: * -> *) ix = PMap (m1 k (m2 k a) ix)
+type instance TrieMapT (P f g) = PMap (TrieMapT f) (TrieMapT g)
+
+class TrieKeyT f m where
+ unionT :: (TrieMapT f ~ m) => (f k -> a ix -> a ix -> a ix) ->
+ m k a ix -> m k a ix -> m k a ix
+ sizeT :: (TrieMapT f ~ m) => m k a ix -> Int
+
+instance (TrieKeyT f m1, TrieKeyT g m2) => TrieKeyT (P f g) (PMap m1 m2) where
+ unionT f (PMap m1) (PMap m2) = PMap (uT (\ a -> unionT (\ b -> f (a :*: b))) m1 m2)
+ where uT = unionT
+ sizeT = error "urk"
+