packages feed

lsm-tree-1.0.0.0: test/Test/Util/TypeFamilyWrappers.hs

{-# LANGUAGE FlexibleContexts         #-}
{-# LANGUAGE StandaloneDeriving       #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE UndecidableInstances     #-}

-- | Type family wrappers are useful for a variety of reasons:
--
-- * Type families can not be partially applied, but type wrappers can.
--
-- * Type family synonyms can not appear in a class head, but type wrappers can.
--
-- * Wrappers can be used to direct type family reduction. For an example, see
--   the uses of 'WrapTable' and co in the definition of 'RealizeIOSim',
--   which can be found in "Test.Util.Orphans".
module Test.Util.TypeFamilyWrappers (
    WrapSession (..)
  , WrapTable (..)
  , WrapCursor (..)
  , WrapBlobRef (..)
  , WrapBlob (..)
  ) where

import           Data.Kind (Type)
import qualified Database.LSMTree.Class as SUT.Class

type WrapSession ::
     ((Type -> Type) -> Type -> Type -> Type -> Type)
  -> (Type -> Type) -> Type
newtype WrapSession h m = WrapSession {
    unwrapSession :: SUT.Class.Session h m
  }

type WrapTable ::
     ((Type -> Type) -> Type -> Type -> Type -> Type)
  -> (Type -> Type) -> Type -> Type -> Type -> Type
newtype WrapTable h m k v b = WrapTable {
    unwrapTable :: h m k v b
  }
  deriving stock (Show, Eq)

type WrapCursor ::
     ((Type -> Type) -> Type -> Type -> Type -> Type)
  -> (Type -> Type) -> Type -> Type -> Type -> Type
newtype WrapCursor h m k v b = WrapCursor {
    unwrapCursor :: SUT.Class.Cursor h m k v b
  }

type WrapBlobRef ::
     ((Type -> Type) -> Type -> Type -> Type -> Type)
  -> (Type -> Type) -> Type -> Type
newtype WrapBlobRef h m b = WrapBlobRef {
    unwrapBlobRef :: SUT.Class.BlobRef h m b
  }

deriving stock instance Show (SUT.Class.BlobRef h m b) => Show (WrapBlobRef h m b)
deriving stock instance Eq (SUT.Class.BlobRef h m b) => Eq (WrapBlobRef h m b)

type WrapBlob :: Type -> Type
newtype WrapBlob b = WrapBlob {
    unwrapBlob :: b
  }
  deriving stock (Show, Eq)