--------------------------------------------------------------------------------

{-# LANGUAGE DeriveLift         #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell    #-}

--------------------------------------------------------------------------------

{-| This module contains orphan 'Lift' instances of types in common libraries
    such as 'containers', for more available compile-time checking of predicates.

-}

module Refined.TH () where

--------------------------------------------------------------------------------

import Data.IntMap.Internal (IntMap(..))
import Data.Map.Internal (Map(..))
import Data.Sequence.Internal (Digit(..), Elem(..), FingerTree(..), Node(..), Seq(..), ViewL(..), ViewR(..))
import Data.Set.Internal (Set(..))
import Data.Tree (Tree(..))

import Language.Haskell.TH.Syntax (Lift)

--------------------------------------------------------------------------------

-- [containers]
deriving instance (Lift a) => Lift (IntMap a)
deriving instance (Lift k, Lift v) => Lift (Map k v)
deriving instance (Lift v) => Lift (Set v)
deriving instance (Lift a) => Lift (Elem a)
deriving instance (Lift a) => Lift (Node a)
deriving instance (Lift a) => Lift (Digit a)
deriving instance (Lift a) => Lift (FingerTree a)
deriving instance (Lift a) => Lift (Seq a)
deriving instance (Lift a) => Lift (ViewL a)
deriving instance (Lift a) => Lift (ViewR a)
deriving instance (Lift a) => Lift (Tree a)

--------------------------------------------------------------------------------