[swift-evolution] Multi dimensional - iterator, Iterator2D, Iterator3D

jaden.geller at gmail.com jaden.geller at gmail.com
Sat Jul 30 21:28:38 CDT 2016


What benefit do Iterator2D and Iterator3D provide that nesting does not?

> On Jul 30, 2016, at 1:48 PM, Ted F.A. van Gaalen via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hi Chris,
> 
> thanks for the tip about Hirundo app!
> 
> A positive side-effect of removing the classical for;; loop
>  (yes, it’s me saying this :o)  is that it forces me to find
> a good and generic equivalent for it, 
> making the conversion of my for;;s to 3.0 easier.
> which is *not* based on collections or sequences and
> does not rely on deeper calls to Sequence etc.
> 
> so, I’ve made the functions [iterator, iterator2D, iterator3D]  (hereunder)
> wich btw clearly demonstrate the power and flexibility of Swift. 
> 
> Very straightforward, and efficient (i assume) just like the classical for;; loop.  
> It works quite well in my sources.
> 
> As a spin-off,  I’ve extended these to iterators for matrices 2D and cubes? 3D...
> 
> Question: 
> Perhaps implementing “multi dimensional iterator functions
> in Swift might  be a good idea. so that is no longer necessary to nest/nest/nest iterators. 
> 
> Met vriendelijke groeten, sorry for my “intensity” in discussing the classical for;; 
> I'll have to rethink this for;; again..  
> Thanks, Ted.
> 
> Any remarks ( all ), suggestions about the code hereunder:              ? 
> 
> protocol NumericType
> {
>     func +(lhs: Self, rhs: Self) -> Self
>     func -(lhs: Self, rhs: Self) -> Self
>     func *(lhs: Self, rhs: Self) -> Self
>     func /(lhs: Self, rhs: Self) -> Self
>     func %(lhs: Self, rhs: Self) -> Self
> }
> 
> extension Double : NumericType { }
> extension Float  : NumericType { }
> extension CGFloat: NumericType { }
> extension Int    : NumericType { }
> extension Int8   : NumericType { }
> extension Int16  : NumericType { }
> extension Int32  : NumericType { }
> extension Int64  : NumericType { }
> extension UInt   : NumericType { }
> extension UInt8  : NumericType { }
> extension UInt16 : NumericType { }
> extension UInt32 : NumericType { }
> extension UInt64 : NumericType { }
> 
> 
> /// Simple iterator with generic parameters, with just a few lines of code.
> /// for most numeric types (see above)
> /// Usage Example:
> ///
> ///   iterate(xmax, { $0 > xmin}, -xstep,
> ///    {x in
> ///        print("x = \(x)")
> ///        return true  // returning false acts like a break
> ///     } )
> ///
> ///  -Parameter vstart: Initial value
> ///  -Parameter step:    The iteration stepping value.
> ///  -Parameter test:    A block with iteration test. e.g. {$0 > 10}
> ///
> ///  -Parameter block:   A block to be executed with each step.
> ///       The block must include a return true (acts like "continue")
> ///                                   or false (acts like "break")
> ///  -Please Note: 
> ///  There is minor precision loss ca: 1/1000 ... 1/500 
> ///  when iterating with floating point numbers.
> ///  However, in most cases this can be safely ignored.
> ///  made by ted van gaalen.
> 
> 
> func iterate<T:NumericType> (
>                     vstart:  T,
>                    _ vstep:  T,
>                    _  test: (T) -> Bool,
>                    _ block: (T) -> Bool )
> {
>     var current = vstart
>     
>     while test(current) && block(current)
>     {
>         current = current + vstep
>     }
> }
> 
> 
> /// X,Y 2D matrix (table) iterator with generic parameters
> func iterate2D<T:NumericType> (
>      xstart:  T,  _ xstep: T, _ xtest: (T) -> Bool,
>    _ ystart:  T,  _ ystep: T, _ ytest: (T) -> Bool,
>    _ block: (T,T) -> Bool )
> {
>     var xcurrent = xstart
>     var ycurrent = ystart
>     
>     var dontStop = true
>     
>     while xtest(xcurrent) && dontStop
>     {
>         ycurrent = ystart
>         while ytest(ycurrent) && dontStop
>         {
>             dontStop = block(xcurrent, ycurrent)
>             ycurrent = ycurrent + ystep
>         }
>         xcurrent = xcurrent + xstep
>     }
> }
> 
> 
> /// X,Y,Z 3D (cubic) iterator with generic parameters:
> 
> func iterate3D<T:NumericType> (
>     xstart:  T,  _ xstep: T, _ xtest: (T) -> Bool,
>   _ ystart:  T,  _ ystep: T, _ ytest: (T) -> Bool,
>   _ zstart:  T,  _ zstep: T, _ ztest: (T) -> Bool,
>       _ block: (T,T,T) -> Bool )
> {
>     var xcurrent = xstart
>     var ycurrent = ystart
>     var zcurrent = zstart
>     
>     var dontStop = true
>     
>     while xtest(xcurrent) && dontStop
>     {
>         ycurrent = ystart
>         while ytest(ycurrent) && dontStop
>         {
>             zcurrent = zstart
>             while ztest(zcurrent) && dontStop
>             {
>                 dontStop = block(xcurrent, ycurrent, zcurrent)
>                 zcurrent = zcurrent + zstep
>             }
>             ycurrent = ycurrent + ystep
>         }
>         xcurrent = xcurrent + xstep
>     }
> }
> 
> 
> func testIterator()
> {
>     iterate(0.0, 0.5, {$0 < 1000.00000} ,
>             { value in
>                 print("Value = \(value) ")
>                 return true
>     } )
> 
>     let startv: CGFloat = -20.0
>     let stepv: CGFloat =   0.5
>     
>     iterate(startv, stepv, {$0 < 1000.00000} ,
>             { val in
>                 print("R = \(val)")
>                 return true
>     } )
> 
>     let tolerance = 0.01 // boundary tolerance for floating point type
>     
>     iterate2D( 0.0, 10.0, { $0 < 100.0 + tolerance } ,
>                0.0,  5.0, { $0 <  50.0 + tolerance } ,
>                {x,y in
>                 print("x = \(x) y = \(y)")
>                 return true  // false from block stops iterating ( like break)
>                 } )
> 
>     iterate3D( 0.0,  10.0, { $0 <   30.0 } ,  // x
>                0.0,   5.0, { $0 <   20.0 } ,  // y
>                10.0, -5.0, { $0 >  -10.0 } ,  // z
>                {x,y,z in
>                     print("x = \(x) y = \(y) z = \(z)")
>                     if z < 0.0
>                     {
>                         print ( "** z value \(z) is below zero! **" )
>                         
>                         return false  // (acts as break in for;;)
>                     }
>                     return true  // return stmt is obligatory (continue)
>                } )
> }
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160730/ea3a47c9/attachment.html>


More information about the swift-evolution mailing list