############################################################################
#
#	File:     step.icn
#
#	Subject:  Procedure to generate in real increments
#
#	Author:   Ralph E. Griswold
#
#	Date:     April 6, 1993
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  step(r1, r2, r3) generates real values from r1 to r2 in increments of
#  r3 (default 1.0).  It is the real equivalent of i to j by k.
#  If r2 is null, the sequence is infinite and is the real equivalent
#  of seq().
#
#  Beware the usual problems of floating-point precision.
#
############################################################################

procedure step(r1, r2, r3)

   r1 := real(r1) | stop("*** invalid argument to step()")
   \r2 := real(r2) | stop("*** invalid argument to step()")
   /r3 := 1.0
   (r3 := real(r3)) ~= 0.0 | stop("*** invalid argument to step()")
   r2 +:= 1E-6				# stab at avoiding underrun

   if \r2 then {			# bounded sequence
      if r3 > 0.0 then {
         while r1 <= r2 do {
           suspend r1
           r1 +:= r3
           }
         }
      else {
         while r1 >= r2 do {
           suspend r1
           r1 +:= r3
           }
         }
      }

   else {				# bounded sequence
      repeat {
         suspend r1
         r1 +:= r3
         }
      }

end
