Interval.st
changeset 11266 4f9e413eba36
parent 10794 b37d77576d77
child 11270 a616ba9b7f81
--- a/Interval.st	Wed Oct 22 08:42:16 2008 +0200
+++ b/Interval.st	Wed Oct 22 09:17:55 2008 +0200
@@ -489,6 +489,49 @@
     ^ stop - start // step + 1
 ! !
 
+!Interval methodsFor:'sorting & reordering'!
+
+reversed
+    "return a copy with elements in reverse order"
+
+    "this can be tricky, if stepping from start does not reach stop exactly.
+     So what is the reverse of: (2 to:5 by: 2) ?
+     I think, that the correct semantic is to behave transparent to the type
+     of collection and generate the same elements as another collection would.
+     In other words, the same as (1 to:5 by: 2) asOrderedCollection reversed
+     would. That means, we get: #(4 2).
+     This also means, that (2 to:5 by: 2) reversed reversed does not return the
+     original, but another interval which generates the same elements !! (2 to:4 by: 2)"
+
+    |rest|
+
+    step isInteger ifTrue:[
+        rest := ((stop - step) rem: step).
+        ^ (stop-rest) to:start by:step negated
+    ].
+    ^ super reversed
+
+
+    "
+     (1 to:4) reversed asOrderedCollection   
+     (1 to:4) reversed reversed asOrderedCollection 
+     (1 to:4) asOrderedCollection reversed    
+     (1 to:4) asOrderedCollection reversed reversed 
+
+     (2 to:5 by: 2) asOrderedCollection     
+     (2 to:5 by: 2) asOrderedCollection reversed    
+     (2 to:5 by: 2) asOrderedCollection reversed reversed  
+     (2 to:5 by: 2) reversed asOrderedCollection         
+     (2 to:5 by: 2) reversed reversed asOrderedCollection   
+
+     (1 to:2 by: 0.3) asOrderedCollection        
+     (1 to:2 by: 0.3) asOrderedCollection reversed  
+     (1 to:2 by: 0.3) asOrderedCollection reversed reversed  
+     (1 to:2 by: 0.3) reversed asOrderedCollection     
+     (1 to:2 by: 0.3) reversed reversed asOrderedCollection     
+    "
+! !
+
 !Interval methodsFor:'testing'!
 
 includes:anElement
@@ -557,5 +600,5 @@
 !Interval class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Interval.st,v 1.44 2007-11-20 11:53:43 mb Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Interval.st,v 1.45 2008-10-22 07:17:55 cg Exp $'
 ! !