{-# LANGUAGE RankNTypes, GADTs, TypeFamilies #-}
module Test where


data T a where
  MkT :: a -> T a
  MkT3 :: forall a. (a ~ Bool) => T a

-- Mismatches in givens
bloh :: T Int -> ()
bloh x = case x of
           MkT3 -> ()

type family F a b
type family G a b
type instance F a Bool = a
type instance G a Char = a

goo1 :: forall a b. (F a b ~ [a]) => b -> a  -> a
goo1 = undefined

goo2 :: forall a. G a Char ~ [Int] => a -> a
goo2 = undefined

-- Just an occurs check
test1 = goo1 False undefined

-- A frozen occurs check, now transformed to decomposition error
test2 = goo2 (goo1 False undefined)
test3 = goo1 False (goo2 undefined)


-- A frozen occurs check, now transformed to both a decomposition and occurs check
data M a where
  M :: M a
data T2 a b where
  T2 :: T2 a b

goo3 :: forall a b. F a b ~ T2 (M a) a => b -> a -> a
goo3 = undefined

goo4 :: forall a c. G a Char ~ T2 (T2 c c) c => a -> a
goo4 = undefined

test4 = goo4 (goo3 False undefined)
test5 = goo3 False (goo4 undefined)



