Index: library/integer.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/integer.m,v
retrieving revision 1.29
diff -u -r1.29 integer.m
--- library/integer.m	23 Nov 2007 07:35:56 -0000	1.29
+++ library/integer.m	1 Apr 2010 07:07:49 -0000
@@ -97,6 +97,10 @@
 :- func integer.float(integer) = float.
 :- func integer.int(integer) = int.
 
+    % As above but wraps on overflow rather than aborting.
+    %
+:- func integer.int_with_overflow(integer) = int.
+
 :- func integer.zero = integer.
 
 :- func integer.one = integer.
@@ -1001,6 +1005,17 @@
         error("integer.int: domain error (conversion would overflow)")
     ).
 
+% XXX: Assuming that the range is that of 2's complement.
+% X' = ((X + max_int+1) `mod` (max_int+1) * 2) - (max_int+1)
+% Note: Can't just call int_list, as int overflow in Mercury is undefined.
+
+integer.int_with_overflow(Integer) = Int :-
+    MaxPlusOne = integer(int.max_int) + integer.one,
+    Wrapped = ((Integer + MaxPlusOne) `mod` (MaxPlusOne * integer(2)))
+                - MaxPlusOne,
+    Wrapped = i(_Sign, Digits),
+    Int = int_list(Digits, 0).
+
 :- func int_list(list(int), int) = int.
 
 int_list([], Accum) = Accum.
