{-# language FlexibleContexts #-}
{-# language TypeFamilies #-}
{-# options_ghc -fno-warn-redundant-constraints #-}
module Rel8.Expr.Num
( fromIntegral
, realToFrac
, div, mod, divMod
, quot, rem, quotRem
, ceiling, floor, round, truncate
)
where
import Prelude ( (+), (-), fst, negate, signum, snd )
import Rel8.Expr ( Expr( Expr ) )
import Rel8.Expr.Eq ( (==.) )
import Rel8.Expr.Function ( function )
import Rel8.Expr.Opaleye ( castExpr )
import Rel8.Schema.Null ( Homonullable, Sql )
import Rel8.Table.Bool ( bool )
import Rel8.Type.Num ( DBFractional, DBIntegral, DBNum )
fromIntegral :: (Sql DBIntegral a, Sql DBNum b, Homonullable a b)
=> Expr a -> Expr b
fromIntegral :: Expr a -> Expr b
fromIntegral (Expr PrimExpr
a) = Expr b -> Expr b
forall a. Sql DBType a => Expr a -> Expr a
castExpr (PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
Expr PrimExpr
a)
realToFrac :: (Sql DBNum a, Sql DBFractional b, Homonullable a b)
=> Expr a -> Expr b
realToFrac :: Expr a -> Expr b
realToFrac (Expr PrimExpr
a) = Expr b -> Expr b
forall a. Sql DBType a => Expr a -> Expr a
castExpr (PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
Expr PrimExpr
a)
ceiling :: (Sql DBFractional a, Sql DBIntegral b, Homonullable a b)
=> Expr a -> Expr b
ceiling :: Expr a -> Expr b
ceiling = String -> Expr a -> Expr b
forall args result.
Function args result =>
String -> args -> result
function String
"ceiling"
div :: Sql DBIntegral a => Expr a -> Expr a -> Expr a
div :: Expr a -> Expr a -> Expr a
div Expr a
n Expr a
d = (Expr a, Expr a) -> Expr a
forall a b. (a, b) -> a
fst (Expr a -> Expr a -> (Expr a, Expr a)
forall a. Sql DBIntegral a => Expr a -> Expr a -> (Expr a, Expr a)
divMod Expr a
n Expr a
d)
mod :: Sql DBIntegral a => Expr a -> Expr a -> Expr a
mod :: Expr a -> Expr a -> Expr a
mod Expr a
n Expr a
d = (Expr a, Expr a) -> Expr a
forall a b. (a, b) -> b
snd (Expr a -> Expr a -> (Expr a, Expr a)
forall a. Sql DBIntegral a => Expr a -> Expr a -> (Expr a, Expr a)
divMod Expr a
n Expr a
d)
divMod :: Sql DBIntegral a => Expr a -> Expr a -> (Expr a, Expr a)
divMod :: Expr a -> Expr a -> (Expr a, Expr a)
divMod Expr a
n Expr a
d = (Expr a, Expr a)
-> (Expr a, Expr a) -> Expr Bool -> (Expr a, Expr a)
forall a. Table Expr a => a -> a -> Expr Bool -> a
bool (Expr a, Expr a)
qr (Expr a
q Expr a -> Expr a -> Expr a
forall a. Num a => a -> a -> a
- Expr a
1, Expr a
r Expr a -> Expr a -> Expr a
forall a. Num a => a -> a -> a
+ Expr a
d) (Expr a -> Expr a
forall a. Num a => a -> a
signum Expr a
r Expr a -> Expr a -> Expr Bool
forall a. Sql DBEq a => Expr a -> Expr a -> Expr Bool
==. Expr a -> Expr a
forall a. Num a => a -> a
negate (Expr a -> Expr a
forall a. Num a => a -> a
signum Expr a
d))
where
qr :: (Expr a, Expr a)
qr@(Expr a
q, Expr a
r) = Expr a -> Expr a -> (Expr a, Expr a)
forall a. Sql DBIntegral a => Expr a -> Expr a -> (Expr a, Expr a)
quotRem Expr a
n Expr a
d
quot :: Sql DBIntegral a => Expr a -> Expr a -> Expr a
quot :: Expr a -> Expr a -> Expr a
quot = String -> Expr a -> Expr a -> Expr a
forall args result.
Function args result =>
String -> args -> result
function String
"div"
rem :: Sql DBIntegral a => Expr a -> Expr a -> Expr a
rem :: Expr a -> Expr a -> Expr a
rem = String -> Expr a -> Expr a -> Expr a
forall args result.
Function args result =>
String -> args -> result
function String
"mod"
quotRem :: Sql DBIntegral a => Expr a -> Expr a -> (Expr a, Expr a)
quotRem :: Expr a -> Expr a -> (Expr a, Expr a)
quotRem Expr a
n Expr a
d = (Expr a -> Expr a -> Expr a
forall a. Sql DBIntegral a => Expr a -> Expr a -> Expr a
quot Expr a
n Expr a
d, Expr a -> Expr a -> Expr a
forall a. Sql DBIntegral a => Expr a -> Expr a -> Expr a
rem Expr a
n Expr a
d)
floor :: (Sql DBFractional a, Sql DBIntegral b, Homonullable a b)
=> Expr a -> Expr b
floor :: Expr a -> Expr b
floor = String -> Expr a -> Expr b
forall args result.
Function args result =>
String -> args -> result
function String
"floor"
round :: (Sql DBFractional a, Sql DBIntegral b, Homonullable a b)
=> Expr a -> Expr b
round :: Expr a -> Expr b
round = String -> Expr a -> Expr b
forall args result.
Function args result =>
String -> args -> result
function String
"round"
truncate :: (Sql DBFractional a, Sql DBIntegral b, Homonullable a b)
=> Expr a -> Expr b
truncate :: Expr a -> Expr b
truncate = String -> Expr a -> Expr b
forall args result.
Function args result =>
String -> args -> result
function String
"trunc"