packages feed

cao-0.1.1: src/Language/CAO/Semantics/Integer.hs

{-  CAO Compiler
    Copyright (C) 2014 Cryptography and Information Security Group, HASLab - INESC TEC and Universidade do Minho

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>. -}

{- |
Module      :  $Header$
Description :  Integer operations semantics.
Copyright   :  (C) 2014 Cryptography and Information Security Group, HASLab - INESC TEC and Universidade do Minho
License     :  GPL

Maintainer  :  Paulo Silva <paufil@di.uminho.pt>
Stability   :  experimental
Portability :  non-portable

Integer operations semantics.
-}

module Language.CAO.Semantics.Integer 
    ( integerPlus
    , integerMinus
    , integerTimes
    , integerPower
    , integerDiv
    , integerMod
    , integerEqual
    , integerNotEqual
    , integerLessThan
    , integerEqualsLessThan
    , integerGreaterThan
    , integerEqualsGreaterThan
    , integerSymmetric
    , integerToBits
    ) where

integerPlus, integerMinus, integerTimes, integerPower, integerDiv, integerMod ::
    Integer -> Integer -> Integer
integerPlus  = (+)
integerMinus = (-)
integerTimes = (*)
integerPower = (^)
integerDiv   = div
integerMod   = mod

integerEqual,integerNotEqual :: Integer -> Integer -> Bool
integerEqual    = (==)
integerNotEqual = (/=)

integerLessThan, integerEqualsLessThan, integerGreaterThan,
    integerEqualsGreaterThan :: Integer -> Integer -> Bool
integerLessThan          = (<)
integerEqualsLessThan    = (<=)
integerGreaterThan       = (>)
integerEqualsGreaterThan = (>=)

integerSymmetric :: Integer -> Integer
integerSymmetric = negate

integerToBits :: Integer -> [Bool]
integerToBits 0 = repeat False
integerToBits i | i < 0     = map not $ integerToBits (-i - 1)
                | otherwise = (i `mod` 2 /= 0) : integerToBits (i `div` 2)