I use the term "cylindrical array" for any collection of things you have to process as "18, 19, 1, 2 ..." or "3, 2, 1, 22, 21, ..."; that is, when you get to either the upper end or the lower end, you continue processing at the other end as if the array were wrapped around a cylinder. There aren't many cases in ordinary data processing where this technique is called for, but when it is, it's always an opportunity to "use a bigger hammer". (Think of pounding a square peg into a round hole: if it doesn't fit, you get a bigger hammer.)
Luckily, it is dead-bang-easy to implement something like this, and you'll see it wherever (for example) an application calls for being able to shift a panel right or left. Now, ISPF facilities do not allow the shifting of panels right and left except for some very special IBM-originated panels as are found in Browse and Edit. A good friend, Chris Lewis, introduced me to a technique for simulating the effect so that it looks like the panel is shifting sideways. The logic was a little bit "bigger-hammerish" so I smoothed it down.
You start with the knowledge of how many items there are in the list (the item-count). To advance to the next item in the array (or list, if you prefer) you MOD the current item-number with the item-count and add one:
next_item = (item // item_count) + 1To retreat to the prior item, sum the item-number and item-count and subtract two, then MOD the result with the item-count and add one:
previous_item = ( (item + item_count - 2) // item_count ) + 1
Here's how it breaks down for a list-of-five:
To go to the next style: (style//stylect) + 1: 1 2 3 4 5 1 2 3 4 0 (mod stylect) 2 3 4 5 1 (add one) To go to the prior style: (style+stylect-2)//stylect + 1 1 2 3 4 5 6 7 8 9 10 (+stylect) 4 5 6 7 8 ( -2 ) 4 0 1 2 3 ( //stylect) 5 1 2 3 4 ( +1 )and this even works when the number of items is one.
At some time in the future, I'll blog about ISPF tables and table-displays and this topic will certainly come up again. If you'd like to see a preview of how it's used, pop on over to my REXX page and take a look at PKGREQS. It may not make much sense at first, but that's just because this blog isn't long enough... yet.