{-|
Module      : Heystone.Internal.Util
Description : Utility (aka helper) functions for the Keystone assembler.
Copyright   : (c) Adrian Herrera, 2016
License     : GPL-2
-}
module Heystone.Internal.Util where

--import Control.Applicative ((<$>))
import Data.Bits

-- | Combine a list of Enums by performing a bitwise-OR.
combineEnums :: (Enum a, Num b, Bits b)
             => [a]
             -> b
combineEnums :: forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineEnums =
    (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (b -> b -> b
forall a. Bits a => a -> a -> a
(.|.) (b -> b -> b) -> (a -> b) -> a -> b -> b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> b
forall a b. (Enum a, Num b) => a -> b
enumToNum) b
0

-- | Convert an 'Enum' to a 'Num'.
enumToNum :: (Enum a, Num b)
          => a
          -> b
enumToNum :: forall a b. (Enum a, Num b) => a -> b
enumToNum =
    Int -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> b) -> (a -> Int) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Int
forall a. Enum a => a -> Int
fromEnum