REBOL[
	File: %tj-operators.r
	Date: 27-Dec-2006
	Title: {Custom math operators}
	Purpose: {Math shorthand. Used by other of my library functions. Rollover operator}
	Author: "Tim Johnson"
	email: tim@johnsons-web.com
	NOTE: {'++ is copied directly from the REBOL docs, '-- and '++- based on '++}
	Library: [
		level: 'beginner
		platform: 'all
		type: [Function one-liner]
		domain: [math]
		tested-under: "Linux, CGI"
		support: ["Tim Johnson" tim@johnsons-web.com]
		license: none
		see-also: none
		]
	]
;  -----------------------------------------------------------------------------------------
div: func[ {returns [quotient remainder]} dividend[integer!] divisor[integer!]
 	      /obj {return context[quot: n rem: n]}
 	][ 
 	either obj[
 		make object! compose[
 			quot: (to-integer dividend / divisor)
 			rem: (dividend // divisor)
 			]
 		][ reduce[to-integer dividend / divisor dividend // divisor] ]
 	]
;  -----------------------------------------------------------------------------------------
++: func[ {increments a value} 'word ] [ set word 1 + get word ]
;  -----------------------------------------------------------------------------------------
 --: func[ {decrements a value} 'word ] [ set word -1 + get word ]
;  -----------------------------------------------------------------------------------------
++-: func[ {increments a value. If it exceeds limiter (or length of limiter), reset to 1} 
 	'word limiter[number! series!] /local limit][ 
 	limit: either series? limiter[length? limiter][limiter]
 	set word 1 + get word 
 	if (get word) > limit[set word 1]
 	]
;  -----------------------------------------------------------------------------------------
;  '++- is very useful for interating over a series and "rolling back" to the first
;    element when past end. 
;  -----------------------------------------------------------------------------------------
comment {
  CONSOLE EXAMPLES FOLLOW
  ----------------------- 
>> do %operators++.r
>> a: 1
== 1
>> ++ a
== 2
>> -- a
== 1
>> s: "abcd"
== "abcd"
>> loop 6[++- a s print s/:a]
b
c
d
a
b
c
>> div 11 4
== [2 3]
>> t: div/obj 11 4
>> probe t
make object! [
    quot: 2
    rem: 3
]
}