{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE KindSignatures        #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances  #-}

module Data.WorldPeace.Subset.Class.Internal (Subset' (..)) where

import           Data.Kind
import           Data.Proxy
import           Data.WorldPeace

-- | Hack around overlapping instances to check subsets
--   of bare values or 'OpenUnion's automatically
class Subset' (flag :: Bool) (err :: Type) (errs :: [Type]) where
  include' :: Proxy flag -> err -> OpenUnion errs

instance Contains err errs => Subset' 'True (OpenUnion err) errs where
  include' _ = relaxOpenUnion

instance IsMember err errs => Subset' 'False err errs where
  include' _ = openUnionLift