module Feldspar.Core.Functions.Fractional where

import Data.Complex

import Feldspar.Core.Types
import Feldspar.Core.Representation
import Feldspar.Core.Constructs
import Feldspar.Core.Functions.Num

-- | Fractional types. The relation to the standard 'Fractional' class is
--
-- @instance `Frational'` a => `Fractional` (`Data` a)@
class (Fractional a, Numeric a) => Fractional' a
  where
    fromRationalFrac :: Rational -> Data a
    fromRationalFrac = value . fromRational

    divFrac :: Data a -> Data a -> Data a
    divFrac = function2 "(/)" fullProp (/)

instance Fractional' Float

instance (Fractional' a, RealFloat a) => Fractional' (Complex a)

instance Fractional' a => Fractional (Data a)
  where
    fromRational = fromRationalFrac
    (/)          = divFrac