GeometricSeries.st
changeset 3737 0a9b58aeacf4
child 3739 89ee5376197c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GeometricSeries.st	Fri Feb 26 11:46:24 2016 +0100
@@ -0,0 +1,189 @@
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+"{ Package: 'stx:libbasic2' }"
+
+"{ NameSpace: Smalltalk }"
+
+ReadOnlySequenceableCollection subclass:#GeometricSeries
+	instanceVariableNames:'start stop factor'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Collections-Sequenceable'
+!
+
+!GeometricSeries class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2000 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+!
+
+documentation
+"
+    Much like intervals (which have a constant difference between elements), 
+    these have a constant factor between them.
+    GeometricSeries represent a collection (or range) of values specified by
+    a startValue, an endValue and a *factor*. 
+    Like with intervals, the elements are computed, not stored.
+    For example, the GeometricSeries (1 to:100 byFactor:2) contains the elements 
+    (1 2 4 8 16 32 64).
+
+    examples:
+
+        (1 to:100 byFactor:2) do:[:i | Transcript showCR:i]
+        (1 to:100 byFactor:1.1) do:[:i | Transcript showCR:i]
+        (1 to:100 byFactor:2) asArray  
+        (1 to:128 byFactor:2) asArray  
+        (128 to:2 byFactor:(1/2)) asArray  
+
+    Q: is GeometricSeries the correct word in english ?
+
+    [author:]
+        Claus Gittinger
+"
+! !
+
+!GeometricSeries class methodsFor:'instance creation'!
+
+from:start to:stop byFactor:factor
+    "return a new geometric series with elements from start
+     to stop by a factor"
+
+    ^ self new setFrom:start to:stop byFactor:factor
+
+
+! !
+
+!GeometricSeries methodsFor:'enumerating'!
+
+do:aBlock
+    "evaluate the argument, aBlock for every element in the
+     receiver. 
+     Redefined since SeqColl accesses the receiver with at:, which is
+     slow for intervals."
+
+    |aValue iter|
+
+    aValue := start.
+    aValue isInteger ifTrue:[
+	factor < 1 ifTrue:[
+	    [stop <= aValue] whileTrue:[
+		aBlock value:aValue.
+		aValue := aValue * factor
+	    ]
+	] ifFalse:[
+	    [stop >= aValue] whileTrue:[
+		aBlock value:aValue.
+		aValue := aValue * factor
+	    ]
+	]
+    ] ifFalse:[
+	"/ the code below avoids rounding errors
+	"/ to accumulate if floats are enumerated.
+	iter := 1.
+	factor < 1 ifTrue:[
+	    [stop <= aValue] whileTrue:[
+		aBlock value:aValue.
+		aValue := start + (factor raisedTo:iter).
+		iter := iter + 1.
+	    ]
+	] ifFalse:[
+	    [stop >= aValue] whileTrue:[
+		aBlock value:aValue.
+		aValue := start + (factor raisedTo:iter).
+		iter := iter + 1.
+	    ]
+	]
+    ]
+
+    "
+     (1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
+     (16 to:1 byFactor:(1/2)) do:[:v | Transcript showCR:v]
+     (1.0 to:128.0 byFactor:2) do:[:v | Transcript showCR:v]
+
+     (GeometricSeries from:1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
+    "
+
+
+!
+
+size
+    |cnt|
+
+    cnt := 0.
+    self do:[:each | cnt := cnt + 1].
+    ^ cnt
+
+    "Created: / 31.10.2001 / 15:06:31 / cg"
+! !
+
+!GeometricSeries methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a printed representation to aStream"
+
+    start printOn:aStream.
+    aStream nextPutAll:' to:'.
+    stop printOn:aStream.
+    aStream nextPutAll:' byFactor:'.
+    factor printOn:aStream.
+
+!
+
+storeOn:aStream
+    "store a representation which can reconstruct the receiver to aStream"
+
+    aStream nextPut:$(.
+    self printOn:aStream.
+    aStream nextPut:$).
+
+
+! !
+
+!GeometricSeries methodsFor:'private'!
+
+setFrom:startVal to:stopVal byFactor:factorVal
+    "set start, stop and factor components"
+
+    start := startVal.
+    stop := stopVal.
+    factor := factorVal
+
+
+!
+
+species
+    "return the type of collection to be returned by collect, select etc."
+
+    ^ OrderedCollection
+
+! !
+
+!GeometricSeries class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+! !
+