RecursiveSeriesStream.st
author Claus Gittinger <cg@exept.de>
Tue, 19 Nov 2019 15:23:27 +0100
changeset 5262 03f0b6c2ca34
parent 5261 ccb88f201f54
permissions -rw-r--r--
#DOCUMENTATION by cg class: RecursiveSeriesStream class comment/format in: #example2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
     1
"{ Encoding: utf8 }"
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
     2
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ Package: 'stx:libbasic2' }"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
"{ NameSpace: Smalltalk }"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
IteratorStream subclass:#RecursiveSeriesStream
5261
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
     8
	instanceVariableNames:'lastValue endValue'
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	classVariableNames:''
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
	poolDictionaries:''
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	category:'Streams'
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
!RecursiveSeriesStream class methodsFor:'documentation'!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
documentation
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    documentation to be added.
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    class:
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
        <a short class summary here, describing what instances represent>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
    responsibilities:    
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
        <describing what my main role is>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    collaborators:    
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
        <describing with whom and how I talk to>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    API:
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        <public api and main messages>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
        
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
    example:
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
        <a one-line examples on how to use - can also be in a separate example method>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    implementation:
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
        <implementation points>
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    [author:]
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
        cg
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    [instance variables:]
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    [class variables:]
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    [see also:]
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
example
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
"
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    52
        |collatz|
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    54
        collatz := [:n | RecursiveSeriesStream on:[:n | n even ifTrue:[n/2] ifFalse:[n*3+1]] startValue:n].
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    55
        (collatz[20]) next:20.  
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    56
        (collatz[24]) next:20.  
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    57
        (collatz[25]) next:30.   
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
example2
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
"
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    63
        |max bits collatz newNums|
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    65
        newNums := OrderedCollection new.        
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    66
        bits := SortedCollection new.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    67
        max := 2.
5262
03f0b6c2ca34 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 5261
diff changeset
    68
        collatz := RecursiveSeriesStream on:[:n | n even ifTrue:[n/2] ifFalse:[(n*3+1)/2]] startValue:1.
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    69
        1 to:100000 do:[:n0 |
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    70
            newNums removeAll.    
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    71
            collatz startValue:n0.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    72
            [
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    73
                |n|
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    74
                n := collatz next.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    75
                newNums add:n.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    76
                n <= max
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    77
            ] whileFalse.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    78
            bits addAll:newNums.
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    79
            [bits notEmpty and:[bits first <= (max+1)]] whileTrue:[max := max max:(bits first). bits removeFirst].
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    80
        ].
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
    81
        self halt.
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
! !
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
!RecursiveSeriesStream class methodsFor:'instance creation'!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
on:aBlock startValue:startValue
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    ^ self basicNew initialize iterator:aBlock startValue:startValue
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
! !
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
!RecursiveSeriesStream methodsFor:'accessing'!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
5261
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    93
atEnd
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    94
    ^ lastValue = endValue
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    95
!
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    96
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    97
endValue:something
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    98
    "define a stop value"
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
    99
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
   100
    endValue := something.
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
   101
!
ccb88f201f54 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5259
diff changeset
   102
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
iterator:aOneArgBlock startValue:startValue
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
    iterator := aOneArgBlock.
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    lastValue := startValue.
5259
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
   106
!
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
   107
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
   108
startValue:startValue
fa49d09cad7b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5257
diff changeset
   109
    lastValue := startValue.
5257
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
! !
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!RecursiveSeriesStream methodsFor:'reading'!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
next
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    "return the next element from the stream by evaluating the nextBlock"
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    |prevValue|
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    prevValue := lastValue.
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    lastValue := iterator value:lastValue.
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    ^ prevValue
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
! !
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
!RecursiveSeriesStream class methodsFor:'documentation'!
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
version_CVS
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    ^ '$Header$'
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
! !
25c9816018d2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130