aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CabalHelper/Compiletime/Types.hs30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/CabalHelper/Compiletime/Types.hs b/src/CabalHelper/Compiletime/Types.hs
index 6b7d74a..9911aec 100644
--- a/src/CabalHelper/Compiletime/Types.hs
+++ b/src/CabalHelper/Compiletime/Types.hs
@@ -15,7 +15,7 @@
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
{-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DefaultSignatures,
- StandaloneDeriving, GADTs, DataKinds, KindSignatures, RankNTypes #-}
+ StandaloneDeriving, GADTs, DataKinds, KindSignatures, RankNTypes, PolyKinds #-}
{-|
Module : CabalHelper.Compiletime.Types
@@ -105,6 +105,34 @@ data DistDir (pt :: ProjType) where
deriving instance Show (DistDir pt)
+-- | General purpose existential wrapper. Useful for hiding a phantom type
+-- argument.
+--
+-- Say you have:
+--
+-- @
+-- {-# LANGUAGE DataKinds, GADTS #-}
+-- data K = A | B | ...
+-- data Q k where
+-- QA :: ... -> Q 'A
+-- QB :: ... -> Q 'B
+-- @
+--
+-- and you want a list of @Q@. You can use @Ex@ to hide the phantom type
+-- argument and recover it later by matching on the GADT constructors:
+--
+-- @
+-- qa :: Q A
+-- qa = QA
+--
+-- qb :: Q B
+-- qb = QB
+--
+-- mylist :: [Ex Q]
+-- mylist = [Ex qa, Ex qb]
+-- @
+data Ex a = forall x. Ex (a x)
+
-- | Environment for running a 'Query'. The constructor is not exposed in the
-- API to allow extending it with more fields without breaking user code.
--