{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE TemplateHaskell, CPP #-}
module Instances.TH.Lift
( -- | This module provides orphan instances for the 'Language.Haskell.TH.Syntax.Lift' class from template-haskell. Following is a list of the provided instances.
--
-- Lift instances are useful to precompute values at compile time using template haskell. For example, if you write the following code,
-- you can make sure that @3 * 10@ is really computed at compile time:
--
-- > {-# LANGUAGE TemplateHaskell #-}
-- >
-- > import Language.Haskell.TH.Syntax
-- >
-- > expensiveComputation :: Word32
-- > expensiveComputation = $(lift $ 3 * 10) -- This will computed at compile time
--
-- This uses the Lift instance for Word32.
--
-- The following instances are provided by this package:
-- * Base
-- | * 'Word8', 'Word16', 'Word32', 'Word64'
--
-- * 'Int8', 'Int16', 'Int32', 'Int64'
-- * Containers (both strict/lazy)
-- | * 'Data.IntMap.IntMap'
--
-- * 'Data.IntSet.IntSet'
--
-- * 'Data.Map.Map'
--
-- * 'Data.Set.Set'
--
-- * 'Data.Tree.Tree'
--
-- * 'Data.Sequence.Seq'
-- * ByteString (both strict/lazy)
-- | * 'Data.ByteString.ByteString'
-- * Text (both strict/lazy)
-- | * 'Data.Text.Text'
-- * Vector (Boxed, Unboxed, Storable, Primitive)
-- | * 'Data.Vector.Vector'
) where
import Language.Haskell.TH.Lift
import qualified Data.Foldable as F
-- Base
#if !MIN_VERSION_template_haskell(2,9,1)
import Language.Haskell.TH
import Data.Int
import Data.Word
#endif
-- Containers
import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import qualified Data.Map as Map
import qualified Data.Sequence as Sequence
import qualified Data.Set as Set
import qualified Data.Tree as Tree
-- Text
import qualified Data.Text as Text
import qualified Data.Text.Lazy as Text.Lazy
-- ByteString
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Lazy as ByteString.Lazy
-- Vector
import qualified Data.Vector as Vector.Boxed
import qualified Data.Vector.Primitive as Vector.Primitive
import qualified Data.Vector.Storable as Vector.Storable
import qualified Data.Vector.Unboxed as Vector.Unboxed
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
#if !MIN_VERSION_template_haskell(2,9,1)
-- Base
instance Lift Word8 where
lift x = [| fromInteger $(lift $ toInteger x) :: Word8 |]
instance Lift Word16 where
lift x = [| fromInteger $(lift $ toInteger x) :: Word16 |]
instance Lift Word32 where
lift x = [| fromInteger $(lift $ toInteger x) :: Word32 |]
instance Lift Word64 where
lift x = [| fromInteger $(lift $ toInteger x) :: Word64 |]
instance Lift Int8 where
lift x = [| fromInteger $(lift $ toInteger x) :: Int8 |]
instance Lift Int16 where
lift x = [| fromInteger $(lift $ toInteger x) :: Int16 |]
instance Lift Int32 where
lift x = [| fromInteger $(lift $ toInteger x) :: Int32 |]
instance Lift Int64 where
lift x = [| fromInteger $(lift $ toInteger x) :: Int64 |]
instance Lift Float where
lift x = [| $(litE $ rationalL $ toRational x) :: Float |]
instance Lift Double where
lift x = [| $(litE $ rationalL $ toRational x) :: Double |]
# endif
--------------------------------------------------------------------------------
-- Containers
instance Lift v => Lift (IntMap.IntMap v) where
lift m = [| IntMap.fromList $(lift $ IntMap.toList m) |]
instance Lift IntSet.IntSet where
lift s = [| IntSet.fromList $(lift $ IntSet.toList s) |]
instance (Lift k, Lift v) => Lift (Map.Map k v) where
lift m = [| Map.fromList $(lift $ Map.toList m) |]
instance Lift a => Lift (Sequence.Seq a) where
lift s = [| Sequence.fromList $(lift $ F.toList s) |]
instance Lift a => Lift (Set.Set a) where
lift s = [| Set.fromList $(lift $ Set.toList s) |]
deriveLift ''Tree.Tree
--------------------------------------------------------------------------------
-- Text
instance Lift Text.Text where
lift t = [| Text.pack $(lift $ Text.unpack t) |]
instance Lift Text.Lazy.Text where
lift t = [| Text.Lazy.pack $(lift $ Text.Lazy.unpack t) |]
--------------------------------------------------------------------------------
-- ByteString
instance Lift ByteString.ByteString where
lift b = [| ByteString.pack $(lift $ ByteString.unpack b) |]
instance Lift ByteString.Lazy.ByteString where
lift b = [| ByteString.Lazy.pack $(lift $ ByteString.Lazy.unpack b) |]
--------------------------------------------------------------------------------
-- Vector
instance (Vector.Primitive.Prim a, Lift a) => Lift (Vector.Primitive.Vector a) where
lift v = [| Vector.Primitive.fromList $(lift $ Vector.Primitive.toList v) |]
instance (Vector.Storable.Storable a, Lift a) => Lift (Vector.Storable.Vector a) where
lift v = [| Vector.Storable.fromList $(lift $ Vector.Storable.toList v) |]
instance (Vector.Unboxed.Unbox a, Lift a) => Lift (Vector.Unboxed.Vector a) where
lift v = [| Vector.Unboxed.fromList $(lift $ Vector.Unboxed.toList v) |]
instance Lift a => Lift (Vector.Boxed.Vector a) where
lift v = [| Vector.Boxed.fromList $(lift $ Vector.Boxed.toList v) |]