{- |
Copyright : Flipstone Technology Partners 2023
License   : MIT
Stability : Stable

@since 1.0.0.0
-}
module Orville.PostgreSQL.Expr.Math
  ( plus
  , minus
  , multiply
  , divide
  , modulo
  , exponentiate
  , bitwiseAnd
  , bitwiseOr
  , bitwiseXor
  , bitwiseShiftLeft
  , bitwiseShiftRight
  )
where

import Orville.PostgreSQL.Expr.BinaryOperator (binaryOpExpression, bitwiseAndOp, bitwiseOrOp, bitwiseShiftLeftOp, bitwiseShiftRightOp, bitwiseXorOp, divisionOp, exponentiationOp, minusOp, moduloOp, multiplicationOp, plusOp)
import Orville.PostgreSQL.Expr.ValueExpression (ValueExpression)

{- | Apply a SQL + to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
plus :: ValueExpression -> ValueExpression -> ValueExpression
plus :: ValueExpression -> ValueExpression -> ValueExpression
plus =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
plusOp

{- | Apply a SQL - to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
minus :: ValueExpression -> ValueExpression -> ValueExpression
minus :: ValueExpression -> ValueExpression -> ValueExpression
minus =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
minusOp

{- | Apply a SQL * to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
multiply :: ValueExpression -> ValueExpression -> ValueExpression
multiply :: ValueExpression -> ValueExpression -> ValueExpression
multiply =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
multiplicationOp

{- | Apply a SQL / to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
divide :: ValueExpression -> ValueExpression -> ValueExpression
divide :: ValueExpression -> ValueExpression -> ValueExpression
divide =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
divisionOp

{- | Apply a SQL % to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
modulo :: ValueExpression -> ValueExpression -> ValueExpression
modulo :: ValueExpression -> ValueExpression -> ValueExpression
modulo =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
moduloOp

{- | Apply a SQL ^ to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
exponentiate :: ValueExpression -> ValueExpression -> ValueExpression
exponentiate :: ValueExpression -> ValueExpression -> ValueExpression
exponentiate =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
exponentiationOp

{- | Apply a SQL & to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
bitwiseAnd :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseAnd :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseAnd =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
bitwiseAndOp

{- | Apply a SQL | to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
bitwiseOr :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseOr :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseOr =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
bitwiseOrOp

{- | Apply a SQL # to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
bitwiseXor :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseXor :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseXor =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
bitwiseXorOp

{- | Apply a SQL << to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
bitwiseShiftLeft :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseShiftLeft :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseShiftLeft =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
bitwiseShiftLeftOp

{- | Apply a SQL >> to the 'ValueExpression's. It is left to the caller to ensure that the operator
 makes sense with the arguments being passed.

@since 1.0.0.0
-}
bitwiseShiftRight :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseShiftRight :: ValueExpression -> ValueExpression -> ValueExpression
bitwiseShiftRight =
  BinaryOperator
-> ValueExpression -> ValueExpression -> ValueExpression
forall sql.
SqlExpression sql =>
BinaryOperator -> ValueExpression -> ValueExpression -> sql
binaryOpExpression BinaryOperator
bitwiseShiftRightOp