overloaded-records-0.1.0.0: src/Data/OverloadedLabels.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude #-}
-- |
-- Module: $HEADER$
-- Description: Magic class for OverloadedLabels.
-- Copyright: (c) 2016, Peter Trško
-- License: BSD3
--
-- Maintainer: peter.trsko@gmail.com
-- Stability: experimental
-- Portability: NoImplicitPrelude
--
-- This module defines the `IsLabel` class is used by the OverloadedLabels
-- extension. See the
-- <https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/OverloadedLabels wiki page>
-- for more details.
--
-- The key idea is that when GHC sees an occurrence of the new
-- overloaded label syntax @#foo@, it is replaced with
--
-- > fromLabel (proxy# :: Proxy# "foo") :: alpha
--
-- plus a wanted constraint @IsLabel "foo" alpha@.
module Data.OverloadedLabels
(
-- * Oveloaded Labels
IsLabel(..)
)
where
#ifdef HAVE_OVERLOADED_LABELS
import GHC.OverloadedLabels (IsLabel(fromLabel))
#else
import GHC.TypeLits (Symbol)
import GHC.Exts (Proxy#)
#endif
#ifndef HAVE_OVERLOADED_LABELS
class IsLabel (l :: Symbol) a where
fromLabel :: Proxy# l -> a
#endif