{-# LANGUAGE OverloadedStrings #-}

module Funcons.Core.Values.Primitive.IntegersBuiltin where

import Funcons.EDSL hiding (integers_)
import qualified Funcons.Operations as VAL

import Funcons.Core.Values.Primitive.BoolBuiltin

library = libFromList [
    ("integer-add", fromValOp integer_add_ VAL.integer_add_)
  , ("int-add", fromValOp integer_add_ VAL.integer_add_)
  , ("int-mul", fromValOp integer_multiply_ VAL.integer_multiply_)
  , ("integer-multiply", fromValOp integer_multiply_ VAL.integer_multiply_)
  , ("integer-divide", fromValOp integer_divide_ VAL.integer_divide_)
  , ("int-div", fromValOp integer_divide_ VAL.integer_divide_)
  , ("integer-subtract", fromValOp integer_subtract_ VAL.integer_subtract_)
  , ("integer-sub", fromValOp integer_subtract_ VAL.integer_subtract_)
  , ("integer-power", fromValOp integer_power_ VAL.integer_power_)
  , ("int-pow", fromValOp integer_power_ VAL.integer_power_)
  , ("integer-list", fromValOp integer_list_ VAL.integer_list_)
  , ("integer-modulo", fromValOp integer_modulo_ VAL.integer_modulo_)
  , ("integer-absolute-value", fromValOp integer_absolute_value_ VAL.integer_absolute_value_)
  , ("integer-abs", fromValOp integer_absolute_value_ VAL.integer_absolute_value_)
  , ("decimal-natural", fromValOp decimal_natural_ VAL.decimal_natural_)
  , ("natural-predecessor", fromValOp natural_predecessor_ VAL.natural_predecessor_)
  , ("nat-pred", fromValOp natural_predecessor_ VAL.natural_predecessor_)
  , ("natural-successor", fromValOp natural_successor_ VAL.natural_successor_)
  , ("nat-succ", fromValOp natural_successor_ VAL.natural_successor_)
  , ("integer-is-less", fromValOp is_less_ VAL.is_less_)
  , ("is-less", fromValOp is_less_ VAL.is_less_)
  , ("integer-is-greater", fromValOp is_greater_ VAL.is_greater_)
  , ("is-greater", fromValOp is_greater_ VAL.is_greater_)
  , ("integer-is-greater-or-equal", fromValOp is_greater_or_equal_ VAL.is_greater_or_equal_)
  , ("is-greater-or-equal", fromValOp is_greater_or_equal_ VAL.is_greater_or_equal_)
  , ("integer-is-less-or-equal", fromValOp is_less_or_equal_ VAL.is_less_or_equal_)
  , ("is-less-or-equal", fromValOp is_less_or_equal_ VAL.is_less_or_equal_)
  , ("integers", fromNullaryValOp integers_ VAL.integers_)
  , ("ints", fromNullaryValOp integers_ VAL.integers_)
  ]

ints_ = integers_
integers_ = applyFuncon "integers"
natural_predecessor_, nat_pred_ :: [Funcons] -> Funcons
natural_predecessor_ = applyFuncon "natural-predecessor"
nat_pred_ = applyFuncon "nat-pred"
natural_successor_, nat_succ_ :: [Funcons] -> Funcons
natural_successor_ = applyFuncon "natural-successor"
nat_succ_ = applyFuncon "nat-succ"
int_add_ = FApp "integer-add"
integer_add_ = FApp "integer-add"
integer_multiply_ = FApp "integer-multiply" 
integer_divide_ = FApp "integer-divide"
integer_subtract_ = applyFuncon "integer-subtract"
integer_power_ = applyFuncon "integer-power"
integer_power_op vx = sortErr (applyFuncon "integer-power" (fvalues vx))
                            "integer-power not applied to two integers"
integer_list_ = applyFuncon "integer-list"
integer_modulo_ = applyFuncon "integer-modulo"
integer_mod_ = applyFuncon "integer-modulo"
integer_absolute_value_ = applyFuncon "integer-absolute-value"
decimal_natural_ = FApp "decimal-natural"
is_less_ = applyFuncon "is-less" 
integer_is_less_ = applyFuncon "is-less" 
is_less_or_equal_ = FApp "is-less-or-equal"
integer_is_less_or_equal_ = FApp "is-less-or-equal"
is_greater_ = FApp "is-greater"
integer_is_greater_ = FApp "is-greater"
is_greater_or_equal_ = FApp "is-greater-or-equal"
integer_is_greater_or_equal_ = FApp "is-greater-or-equal"