{-# LANGUAGE TypeFamilies, TypeOperators, EmptyDataDecls #-}

module T4174 where

import Data.Kind (Type)

data True
data False

data Minor1

data GHC6'8 m
data GHC6'10 m

type family a :<=: b :: {-Bool-} Type
type instance GHC6'10 m1 :<=: GHC6'8 m2 = False

type a :>=: b = b :<=: a

data Way ghcVersion tablesNextToCode profiling threaded

type family GHCVersion way :: {-GHCVersion-} Type
type instance GHCVersion (Way v n p t) = v

type family Threaded way :: {-Bool-} Type
type instance Threaded (Way v n p t) = t

data Field w s t
data SmStep
data RtsSpinLock

field :: String -> m (Field w a b)
field = undefined

type family WayOf (m :: Type -> Type) :: Type

sync_large_objects :: (Monad m, 
                       (GHCVersion (WayOf m) :>=: GHC6'10 Minor1) ~ True, 
                       Threaded (WayOf m) ~ True) 
                   => m (Field (WayOf m) SmStep RtsSpinLock)
sync_large_objects = field "sync_large_objects"

testcase :: Monad m => m (Field (Way (GHC6'8 minor) n t p) a b)
testcase = sync_large_objects

{- Wanted constraints from the occurrence of sync_large_objects

   (WayOf m) ~ (Way (GHC6'8 minor) n t p)
   a ~ SmStep
   b ~ RtsSpinLock

   Threaded (WayOf m) ~ True 
     == Threaded (Way (GHC6'8 minor) n t p) ~ True 
     == p ~ True   

   (GHCVersion (WayOf m) :>=: GHC6'10 Minor1) ~ True, 
     == (GHC6'10 Minor1 :<=: GHCVersion (WayOf m)) ~ True, 
     == (GHC6'10 Minor1 :<=: GHCVersion (Way (GHC6'8 minor) n t p))) ~ True, 
     == (GHC6'10 Minor1 :<=: GHC6'8 minor) ~ True
     == False ~ True

-}
