inline-r-0.7.0.0: src/Control/Memory/Region.hs
-- |
-- Copyright: (C) 2013 Amgen, Inc.
--
-- Phantom type indices for segregating values into "regions" of memory, which
-- are markers that serve as static conservative approximations of the liveness
-- of an object. That is, regions have scopes, and objects within a region are
-- guaranteed to remain live within the scope of that region.
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Control.Memory.Region where
import GHC.Exts (Constraint)
-- | The global region is a special region whose scope extends all the way to
-- the end of the program. As such, any object allocated within this region
-- lives "forever". In this sense, it is the top-level region, whose scope
-- includes all other regions.
data GlobalRegion
-- | Void is not a region. It is a placeholder marking the absence of region.
-- Useful to tag objects that belong to no region at all.
data Void
-- | Convenient shorthand.
type G = GlobalRegion
-- | Convenient shorthand.
type V = Void
-- | A partial order on regions. In fact regions form a lattice, with
-- 'GlobalRegion' being the supremum and 'Void' the infimum.
type family a <= b :: Constraint
type instance a <= a = ()
type instance a <= G = ()
type instance V <= b = ()