module Satchmo.Unary.Op.Flexible 
       
( module Satchmo.Unary.Op.Common 
, add
, add_quadratic
, add_by_odd_even_merge
, add_by_bitonic_sort
)       
       
where

import Prelude hiding ( not, and, or )
import qualified Prelude

import Satchmo.Boolean
import   Satchmo.Unary.Data
import qualified Satchmo.Unary.Op.Common as C
import Satchmo.Unary.Op.Common hiding
  (add_quadratic, add_by_odd_even_merge, add_by_bitonic_sort)

import Control.Monad ( forM )
import qualified Data.Map as M

-- | Unary addition. Output bit length is sum of input bit lengths.
add :: MonadSAT m => Number -> Number -> m Number
add :: forall (m :: * -> *). MonadSAT m => Number -> Number -> m Number
add = forall (m :: * -> *). MonadSAT m => Number -> Number -> m Number
add_by_odd_even_merge

add_quadratic :: Number -> Number -> m Number
add_quadratic Number
a Number
b = 
    forall (m :: * -> *).
MonadSAT m =>
Maybe Int -> Number -> Number -> m Number
C.add_quadratic (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a -> a
(+) ( Number -> Int
width Number
a ) ( Number -> Int
width Number
b )) Number
a Number
b

add_by_odd_even_merge :: Number -> Number -> m Number
add_by_odd_even_merge Number
a Number
b = 
    forall (m :: * -> *).
MonadSAT m =>
Maybe Int -> Number -> Number -> m Number
C.add_by_odd_even_merge (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a -> a
(+) ( Number -> Int
width Number
a ) ( Number -> Int
width Number
b )) Number
a Number
b

add_by_bitonic_sort :: Number -> Number -> m Number
add_by_bitonic_sort Number
a Number
b = 
    forall (m :: * -> *).
MonadSAT m =>
Maybe Int -> Number -> Number -> m Number
C.add_by_bitonic_sort (forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. Num a => a -> a -> a
(+) ( Number -> Int
width Number
a ) ( Number -> Int
width Number
b )) Number
a Number
b