{-# LANGUAGE ConstraintKinds       #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms       #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE UndecidableInstances  #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Module      : Data.Array.Accelerate.Internal.Orphans.Elt
-- Copyright   : [2016..2020] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Orphan Elt instances for BigWord and BigInt
--

module Data.Array.Accelerate.Internal.Orphans.Elt (

  pattern W2_,
  pattern I2_,

) where

import Data.Array.Accelerate.Internal.BigInt
import Data.Array.Accelerate.Internal.BigWord

import Data.Array.Accelerate                              hiding ( pattern I2 )


instance (Elt a, Elt b) => Elt (BigWord a b)

pattern W2_ :: (Elt a, Elt b) => Exp a -> Exp b -> Exp (BigWord a b)
pattern $bW2_ :: Exp a -> Exp b -> Exp (BigWord a b)
$mW2_ :: forall r a b.
(Elt a, Elt b) =>
Exp (BigWord a b) -> (Exp a -> Exp b -> r) -> (Void# -> r) -> r
W2_ a b = Pattern (a, b)
{-# COMPLETE W2_ #-}

instance (Lift Exp a, Lift Exp b, Elt (Plain a), Elt (Plain b))
    => Lift Exp (BigWord a b) where
  type Plain (BigWord a b) = BigWord (Plain a) (Plain b)
  lift :: BigWord a b -> Exp (Plain (BigWord a b))
lift (W2 a
a b
b) = Exp (Plain a) -> Exp (Plain b) -> Exp (BigWord (Plain a) (Plain b))
forall a b. (Elt a, Elt b) => Exp a -> Exp b -> Exp (BigWord a b)
W2_ (a -> Exp (Plain a)
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift a
a) (b -> Exp (Plain b)
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift b
b)

instance (Elt a, Elt b) => Unlift Exp (BigWord (Exp a) (Exp b)) where
  unlift :: Exp (Plain (BigWord (Exp a) (Exp b))) -> BigWord (Exp a) (Exp b)
unlift (W2_ a b) = Exp a -> Exp b -> BigWord (Exp a) (Exp b)
forall hi lo. hi -> lo -> BigWord hi lo
W2 Exp a
a Exp b
b


instance (Elt a, Elt b) => Elt (BigInt a b)

pattern I2_ :: (Elt a, Elt b) => Exp a -> Exp b -> Exp (BigInt a b)
pattern $bI2_ :: Exp a -> Exp b -> Exp (BigInt a b)
$mI2_ :: forall r a b.
(Elt a, Elt b) =>
Exp (BigInt a b) -> (Exp a -> Exp b -> r) -> (Void# -> r) -> r
I2_ a b = Pattern (a, b)
{-# COMPLETE I2_ #-}

instance (Lift Exp a, Lift Exp b, Elt (Plain a), Elt (Plain b))
    => Lift Exp (BigInt a b) where
  type Plain (BigInt a b) = BigInt (Plain a) (Plain b)
  lift :: BigInt a b -> Exp (Plain (BigInt a b))
lift (I2 a
a b
b)           = Exp (Plain a) -> Exp (Plain b) -> Exp (BigInt (Plain a) (Plain b))
forall a b. (Elt a, Elt b) => Exp a -> Exp b -> Exp (BigInt a b)
I2_ (a -> Exp (Plain a)
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift a
a) (b -> Exp (Plain b)
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift b
b)

instance (Elt a, Elt b) => Unlift Exp (BigInt (Exp a) (Exp b)) where
  unlift :: Exp (Plain (BigInt (Exp a) (Exp b))) -> BigInt (Exp a) (Exp b)
unlift (I2_ a b) = Exp a -> Exp b -> BigInt (Exp a) (Exp b)
forall hi lo. hi -> lo -> BigInt hi lo
I2 Exp a
a Exp b
b