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

Ted F.A. van Gaalen tedvgiosdev at gmail.com
Sun Jul 31 08:18:21 CDT 2016


> On 31.07.2016, at 04:28, jaden.geller at gmail.com wrote:
> 
> What benefit do Iterator2D and Iterator3D provide that nesting does not?
Hi Jaden,
well, simply because of hiding/enclosing repetitive functionality
like with every other programming element is convenient,
prevents errors and from writing the same over and over again.
That is why there are functions.
but you already know that, of course.
Kind Regards
TedvG

> 
> On Jul 30, 2016, at 1:48 PM, Ted F.A. van Gaalen via swift-evolution <swift-evolution at swift.org <mailto: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 <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160731/8b8b51c4/attachment.html>


More information about the swift-evolution mailing list