@@ -105,11 +105,16 @@ inlineCommonValues = everywhereOnCpp convert
105105 | isDict' [semiringNumber, semiringInt] dict && isFn fnOne fn = CppNumericLiteral (Left 1)
106106 | isDict boundedBoolean dict && isFn fnBottom fn = CppBooleanLiteral False
107107 | isDict boundedBoolean dict && isFn fnTop fn = CppBooleanLiteral True
108+ convert (CppApp fn [dict, x, y])
109+ | isDict semiringInt dict && isFn fnAdd fn = CppBinary Add x y
110+ | isDict semiringInt dict && isFn fnMultiply fn = CppBinary Multiply x y
111+ | isDict euclideanRingInt dict && isFn fnDivide fn = CppBinary Divide x y
112+ | isDict ringInt dict && isFn fnSubtract fn = CppBinary Subtract x y
108113 convert (CppApp (CppApp (CppApp fn [dict]) [x]) [y])
109− | isDict semiringInt dict && isFn fnAdd fn = intOp Add x y
110− | isDict semiringInt dict && isFn fnMultiply fn = intOp Multiply x y
111− | isDict euclideanRingInt dict && isFn fnDivide fn = intOp Divide x y
112− | isDict ringInt dict && isFn fnSubtract fn = intOp Subtract x y
114+ | isDict semiringInt dict && isFn fnAdd fn = CppBinary Add x y
115+ | isDict semiringInt dict && isFn fnMultiply fn = CppBinary Multiply x y
116+ | isDict euclideanRingInt dict && isFn fnDivide fn = CppBinary Divide x y
117+ | isDict ringInt dict && isFn fnSubtract fn = CppBinary Subtract x y
113118 convert other = other
114119 fnZero = (C.dataSemiring, C.zero)
115120 fnOne = (C.dataSemiring, C.one)
@@ -119,7 +124,6 @@ inlineCommonValues = everywhereOnCpp convert
119124 fnDivide = (C.dataEuclideanRing, C.div)
120125 fnMultiply = (C.dataSemiring, C.mul)
121126 fnSubtract = (C.dataRing, C.sub)
122− intOp op x y = CppBinary BitwiseOr (CppBinary op x y) (CppNumericLiteral (Left 0))
123127
124128inlineOperator :: (String, String) -> (Cpp -> Cpp -> Cpp) -> Cpp -> Cpp
125129inlineOperator (m, op) f = everywhereOnCpp convert
@@ -198,18 +202,21 @@ inlineCommonOperators = applyAll $
198202 binary dict fns op = everywhereOnCpp convert
199203 where
200204 convert :: Cpp -> Cpp
205+ convert (CppApp fn [dict', x, y]) | isDict dict dict' && isFn fns fn = CppBinary op x y
201206 convert (CppApp (CppApp (CppApp fn [dict']) [x]) [y]) | isDict dict dict' && isFn fns fn = CppBinary op x y
202207 convert other = other
203208 binary' :: String -> String -> BinaryOperator -> Cpp -> Cpp
204209 binary' moduleName opString op = everywhereOnCpp convert
205210 where
206211 convert :: Cpp -> Cpp
212+ convert (CppApp fn [x, y]) | isFn (moduleName, opString) fn = CppBinary op x y
207213 convert (CppApp (CppApp fn [x]) [y]) | isFn (moduleName, opString) fn = CppBinary op x y
208214 convert other = other
209215 unary :: (String, String) -> (String, String) -> UnaryOperator -> Cpp -> Cpp
210216 unary dicts fns op = everywhereOnCpp convert
211217 where
212218 convert :: Cpp -> Cpp
219+ convert (CppApp fn [dict', x]) | isDict dicts dict' && isFn fns fn = CppUnary op x
213220 convert (CppApp (CppApp fn [dict']) [x]) | isDict dicts dict' && isFn fns fn = CppUnary op x
214221 convert other = other
215222 unary' :: String -> String -> UnaryOperator -> Cpp -> Cpp