{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Array.Accelerate.Classes.Fractional (
  Fractional,
  (P./), P.recip, fromRational,
) where
import Data.Array.Accelerate.Smart
import Data.Array.Accelerate.Type
import Data.Array.Accelerate.Classes.Num
import Prelude                                                      ( Rational, (.) )
import qualified Prelude                                            as P
fromRational :: Fractional a => Rational -> Exp a
fromRational = P.fromRational
type Fractional a = (Num a, P.Fractional (Exp a))
instance P.Fractional (Exp Half) where
  (/)          = mkFDiv
  recip        = mkRecip
  fromRational = constant . P.fromRational
instance P.Fractional (Exp Float) where
  (/)          = mkFDiv
  recip        = mkRecip
  fromRational = constant . P.fromRational
instance P.Fractional (Exp Double) where
  (/)          = mkFDiv
  recip        = mkRecip
  fromRational = constant . P.fromRational
instance P.Fractional (Exp CFloat) where
  (/)          = mkFDiv
  recip        = mkRecip
  fromRational = constant . P.fromRational
instance P.Fractional (Exp CDouble) where
  (/)          = mkFDiv
  recip        = mkRecip
  fromRational = constant . P.fromRational