-- | Provides the 'Division' typeclass for abstracting over division.
--
-- @since 0.1
module Numeric.Class.Division
  ( Division (..),
  )
where

import Data.Int (Int16, Int32, Int64, Int8)
import Data.Word (Word16, Word32, Word64, Word8)
import GHC.Natural (Natural)
import GHC.Real (Ratio)

-- | Abstracts over division operators.
--
-- @since 0.1
class Division a where
  divide :: a -> a -> a

-- | @since 0.1
instance Division Float where
  divide :: Float -> Float -> Float
divide = Float -> Float -> Float
forall a. Fractional a => a -> a -> a
(/)
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Double where
  divide :: Double -> Double -> Double
divide = Double -> Double -> Double
forall a. Fractional a => a -> a -> a
(/)
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Int where
  divide :: Int -> Int -> Int
divide = Int -> Int -> Int
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Int8 where
  divide :: Int8 -> Int8 -> Int8
divide = Int8 -> Int8 -> Int8
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Int16 where
  divide :: Int16 -> Int16 -> Int16
divide = Int16 -> Int16 -> Int16
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Int32 where
  divide :: Int32 -> Int32 -> Int32
divide = Int32 -> Int32 -> Int32
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Int64 where
  divide :: Int64 -> Int64 -> Int64
divide = Int64 -> Int64 -> Int64
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Integer where
  divide :: Integer -> Integer -> Integer
divide = Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Word where
  divide :: Word -> Word -> Word
divide = Word -> Word -> Word
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Word8 where
  divide :: Word8 -> Word8 -> Word8
divide = Word8 -> Word8 -> Word8
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Word16 where
  divide :: Word16 -> Word16 -> Word16
divide = Word16 -> Word16 -> Word16
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Word32 where
  divide :: Word32 -> Word32 -> Word32
divide = Word32 -> Word32 -> Word32
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Word64 where
  divide :: Word64 -> Word64 -> Word64
divide = Word64 -> Word64 -> Word64
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division Natural where
  divide :: Natural -> Natural -> Natural
divide = Natural -> Natural -> Natural
forall a. Integral a => a -> a -> a
div
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division (Ratio Integer) where
  divide :: Ratio Integer -> Ratio Integer -> Ratio Integer
divide = Ratio Integer -> Ratio Integer -> Ratio Integer
forall a. Fractional a => a -> a -> a
(/)
  {-# INLINEABLE divide #-}

-- | @since 0.1
instance Division (Ratio Natural) where
  divide :: Ratio Natural -> Ratio Natural -> Ratio Natural
divide = Ratio Natural -> Ratio Natural -> Ratio Natural
forall a. Fractional a => a -> a -> a
(/)
  {-# INLINEABLE divide #-}