units-2.4.1.5: Data/Metrology/Set.hs
{- Data/Metrology/Set.hs
The units Package
Copyright (c) 2013 Richard Eisenberg
rae@cs.brynmawr.edu
Defines set-like operations on type-level lists.
-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Metrology.Set
-- Copyright : (C) 2013 Richard Eisenberg
-- License : BSD-style (see LICENSE)
-- Maintainer : Richard Eisenberg (rae@cs.brynmawr.edu)
-- Stability : experimental
-- Portability : non-portable
--
-- This module defines a few set-like operations on type-level lists. It
-- may be applicable beyond the units package.
-----------------------------------------------------------------------------
{-# LANGUAGE DataKinds, PolyKinds, TypeFamilies, TypeOperators,
UndecidableInstances #-}
module Data.Metrology.Set where
import GHC.Exts ( Constraint )
-- | Are two lists equal, when considered as sets?
type family SetEqual (as :: [k]) (bs :: [k]) :: Constraint where
SetEqual as bs = (Subset as bs, Subset bs as)
-- | Is one list a subset of the other?
type family Subset (as :: [k]) (bs :: [k]) :: Constraint where
Subset '[] bs = (() :: Constraint)
Subset (a ': as) bs = (a `Elem` bs, as `Subset` bs)
-- | Is an element contained in a list?
type family Elem (a :: k) (bs :: [k]) :: Constraint where
Elem a (a ': bs) = (() :: Constraint)
Elem a (b ': bs) = a `Elem` bs