checkin from browser
authorClaus Gittinger <cg@exept.de>
Thu, 09 May 1996 14:28:31 +0200
changeset 290 f4fbe0881e1b
parent 289 c4a61914a9a0
child 291 395079f968b6
checkin from browser
Iterator.st
--- a/Iterator.st	Thu May 09 01:09:18 1996 +0200
+++ b/Iterator.st	Thu May 09 14:28:31 1996 +0200
@@ -1,169 +1,43 @@
-"       NAME            Iterator
-        AUTHOR          miw@cs.man.ac.uk (Mario Wolczko)
-        FUNCTION        a wrapper for blocks that iterate over collections
-        ST-VERSION      4.0 4.1
-        PREREQUISITES   
-        CONFLICTS
-        DISTRIBUTION    world
-        VERSION         1
-        DATE    18 Jun 1991
-        SUMMARY
- Occasionally you may have a block that when evaluated can be
-treated as a collection -- ie it takes another block as parameter,
-then applies that to a sequence of values.
-
-This goodie wraps the block into an object -- an iterator -- which is
-part of the collection hierarchy, and therefore inherits a variety of
-useful collection-related methods.
-
-Mario Wolczko
-
-Dept. of Computer Science   Internet:      mario@cs.man.ac.uk
-The University              uucp:        uknet!!man.cs!!mario
-Manchester M13 9PL          JANET:         mario@uk.ac.man.cs
-U.K.                        Tel: +44-61-275 6146  (FAX: 6236)
-______the mushroom project___________________________________
-
 "
-'From Objectworks(r)\Smalltalk, Release 4 of 25 October 1990 on 18 June 1991 at 7:48:59 pm'!
-
-Collection subclass: #Iterator
-        instanceVariableNames: 'block '
-        classVariableNames: ''
-        poolDictionaries: ''
-        category: 'Collections-Sequenceable'
-!
-
-Iterator comment:
-'An Iterator is a read-only collection that evaluates a block to yield the elements
- of the collection.'
-!
+ COPYRIGHT.
+ The above file is a Manchester Goodie protected by copyright.
+ These conditions are imposed on the whole Goodie, and on any significant
+ part of it which is separately transmitted or stored:
+        * You must ensure that every copy includes this notice, and that
+          source and author(s) of the material are acknowledged.
+        * These conditions must be imposed on anyone who receives a copy.
+        * The material shall not be used for commercial gain without the prior
+          written consent of the author(s).
+ Further information on the copyright conditions may be obtained by
+ sending electronic mail:
+        To: goodies-lib@cs.man.ac.uk
+        Subject: copyright
+ or by writing to The Smalltalk Goodies Library Manager, Dept of
+ Computer Science, The University, Manchester M13 9PL, UK
 
-!Iterator methodsFor: 'removing'!
-
-remove: oldObject ifAbsent: anExceptionBlock 
-        "Iterators are read-only."
-        self shouldNotImplement
-! !
-
-!Iterator methodsFor: 'adding'!
-
-add: anObject
-        "Iterators are read-only"
-        self shouldNotImplement
-! !
-
-!Iterator methodsFor: 'enumerating'!
-
-do: aBlock
-        block value: aBlock
-!
+ (C) Copyright 1992 University of Manchester
+ For more information about the Manchester Goodies Library (from which 
+ this file was distributed) send e-mail:
+        To: goodies-lib@cs.man.ac.uk
+        Subject: help 
+"
 
-findFirst: aBlock
-        "Answer the index of the first element of the receiver
-        for which aBlock evaluates as true."
 
-        | index |
-        index := 1.
-        self do: [ :el | (aBlock value: el) ifTrue: [^index].  index := index + 1].
-
-        ^0
-!
-
-findLast: aBlock
-        "Answer the index of the last element of the receiver
-        for which aBlock evaluates as true."
-
-        | index last |
-        index := 1.
-        last := 0.
-        self do: [ :el | (aBlock value: el) ifTrue: [last := index].  index := index + 1].
-        ^last
+Collection subclass:#Iterator
+	instanceVariableNames:'block'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Collections-Sequenceable'
 !
 
-keysAndValuesDo: aBlock  
-        "Evaluate aBlock with each of the receiver's key/value pairs
-        (e.g. indexes and elements) as the arguments."
-
-        | index |
-        index := 1.
-        self do: [:el | aBlock value: index value: el.  index := index + 1]
-! !
-
-!Iterator methodsFor: 'accessing'!
-
-identityIndexOf: anElement 
-        "Answer the identity index of anElement within the receiver.  
-         If the receiver does not contain anElement, answer 0."
-
-        ^self identityIndexOf: anElement ifAbsent: [0]
-!
-
-identityIndexOf: anElement ifAbsent: exceptionBlock 
-        "Answer the identity index of anElement within the receiver.  
-         If the receiver does not contain anElement, answer the result 
-         of evaluating the exceptionBlock."
-
-        | index |
-        index := 1.
-        self do: [ :el | el == anElement ifTrue: [^index].  index := index + 1].
-        ^exceptionBlock value
-!
-
-indexOf: anElement 
-        "Answer the index of anElement within the receiver.  If the receiver does
-        not contain anElement, answer 0."
-
-        ^self indexOf: anElement ifAbsent: [0]
-!
-
-indexOf: anElement ifAbsent: exceptionBlock 
-        "Answer the index of anElement within the receiver.  If the receiver does
-        not contain anElement, answer the result of evaluating the exceptionBlock."
-
+Iterator comment:'An Iterator is a read-only collection that evaluates a block to yield the elements
+ of the collection.'!
 
-        | index |
-        index := 1.
-        self do: [ :el | el = anElement ifTrue: [^index].  index := index + 1].
-        ^exceptionBlock value
-! !
-
-!Iterator methodsFor: 'private'!
-
-block: aBlock
-        block := aBlock
-!
-
-species
-        ^OrderedCollection
-! !
-
-!Iterator methodsFor: 'converting'!
+!Iterator class methodsFor:'documentation'!
 
-asOrderedCollection
-        "Answer a new instance of OrderedCollection whose elements are the elements of
-        the receiver.  The order in which elements are added depends on the order in
-        which the receiver enumerates its elements.  In the case of unordered collections,
-        the ordering is not necessarily the same for multiple requests for the conversion."
-
-
-        | anOrderedCollection |
-        anOrderedCollection := OrderedCollection new.
-        self do: [:each | anOrderedCollection addLast: each].
-        ^anOrderedCollection
-! !
-
-!Iterator class methodsFor: 'instance creation'!
-
-on: aBlock
-        ^self new block: aBlock
-!
-
-on: collection msg: msg
-        ^self new block: [ :aBlock | collection perform: msg with: aBlock]
-! !
-
-"COPYRIGHT.
+copyright
+"
+ COPYRIGHT.
  The above file is a Manchester Goodie protected by copyright.
  These conditions are imposed on the whole Goodie, and on any significant
  part of it which is separately transmitted or stored:
@@ -184,4 +58,242 @@
  this file was distributed) send e-mail:
         To: goodies-lib@cs.man.ac.uk
         Subject: help 
-"!
+"
+
+!
+
+documentation
+"
+    Occasionally you may have a block that when evaluated can be
+    treated as a collection -- ie it takes another block as parameter,
+    then applies that to a sequence of values.
+
+    This goodie wraps the block into an object -- an iterator -- which is
+    part of the collection hierarchy, and therefore inherits a variety of
+    useful collection-related methods.
+
+    [info:]
+        NAME            Iterator
+        AUTHOR          miw@cs.man.ac.uk (Mario Wolczko)
+        FUNCTION        a wrapper for blocks that iterate over collections
+        ST-VERSION      4.0 4.1
+        PREREQUISITES   
+        CONFLICTS
+        DISTRIBUTION    world
+        VERSION         1
+        DATE    18 Jun 1991
+        SUMMARY
+
+    [organisation:]
+        Dept. of Computer Science   Internet:      mario@cs.man.ac.uk
+        The University              uucp:        uknet!!!!man.cs!!!!mario
+        Manchester M13 9PL          JANET:         mario@uk.ac.man.cs
+        U.K.                        Tel: +44-61-275 6146  (FAX: 6236)
+        ______the mushroom project___________________________________
+
+    [author:]
+        Mario Wolczko miw@cs.man.ac.uk
+"
+
+!
+
+examples
+"
+ an iterator, simulating a collection of 100 random values:
+                                                                        [exBegin]
+     |i b|
+
+     b := [:whatToDo |
+               |rnd|
+
+               rnd := Random new.
+               1 to:100 do:[:i | 
+                  whatToDo value:(rnd next)
+               ] 
+          ].
+
+     i := Iterator on:b.
+     i do:[:j |
+        j printNL
+     ].
+                                                                        [exEnd]
+"
+
+! !
+
+!Iterator class methodsFor:'instance creation'!
+
+on: aBlock
+    ^ self new block: aBlock
+
+    "
+     |i b|
+
+     b := [:whatToDo | 
+               1 to:10 do:[:i | 
+                  whatToDo value:i
+               ] 
+          ].
+
+     i := Iterator on:b.
+     i do:[:j |
+        j printNL
+     ].
+    "
+
+    "
+     an iterator, simulating a collection of 100 random values:
+
+     |i b|
+
+     b := [:whatToDo |
+               |rnd|
+
+               rnd := Random new.
+               1 to:100 do:[:i | 
+                  whatToDo value:(rnd next)
+               ] 
+          ].
+
+     i := Iterator on:b.
+     i do:[:j |
+        j printNL
+     ].
+    "
+
+    "Modified: 9.5.1996 / 14:26:49 / cg"
+!
+
+on:collection msg:msg
+    ^ self new block: [ :aBlock | collection perform: msg with: aBlock]
+
+    "
+     |rnd i|
+
+     rnd := Random new.
+     i := Iterator on:[:a | rnd next].
+     i do:[:j |
+        j printNL
+     ].
+    "
+
+    "Modified: 9.5.1996 / 14:21:40 / cg"
+! !
+
+!Iterator methodsFor:'accessing'!
+
+identityIndexOf: anElement 
+    "Answer the identity index of anElement within the receiver.  
+     If the receiver does not contain anElement, answer 0."
+
+    ^self identityIndexOf: anElement ifAbsent: [0]
+!
+
+identityIndexOf: anElement ifAbsent: exceptionBlock 
+    "Answer the identity index of anElement within the receiver.  
+     If the receiver does not contain anElement, answer the result 
+     of evaluating the exceptionBlock."
+
+    | index |
+    index := 1.
+    self do: [ :el | el == anElement ifTrue: [^index].  index := index + 1].
+    ^exceptionBlock value
+!
+
+indexOf: anElement 
+    "Answer the index of anElement within the receiver.  If the receiver does
+    not contain anElement, answer 0."
+
+    ^self indexOf: anElement ifAbsent: [0]
+!
+
+indexOf: anElement ifAbsent: exceptionBlock 
+    "Answer the index of anElement within the receiver.  If the receiver does
+    not contain anElement, answer the result of evaluating the exceptionBlock."
+
+
+    | index |
+    index := 1.
+    self do: [ :el | el = anElement ifTrue: [^index].  index := index + 1].
+    ^exceptionBlock value
+! !
+
+!Iterator methodsFor:'adding & removing'!
+
+add: anObject
+    "Iterators are read-only"
+    self shouldNotImplement
+!
+
+remove: oldObject ifAbsent: anExceptionBlock 
+    "Iterators are read-only."
+    self shouldNotImplement
+! !
+
+!Iterator methodsFor:'converting'!
+
+asOrderedCollection
+    "Answer a new instance of OrderedCollection whose elements are the elements of
+    the receiver.  The order in which elements are added depends on the order in
+    which the receiver enumerates its elements.  In the case of unordered collections,
+    the ordering is not necessarily the same for multiple requests for the conversion."
+
+
+    | anOrderedCollection |
+    anOrderedCollection := OrderedCollection new.
+    self do: [:each | anOrderedCollection addLast: each].
+    ^anOrderedCollection
+! !
+
+!Iterator methodsFor:'enumerating'!
+
+do: aBlock
+    block value: aBlock
+!
+
+findFirst: aBlock
+    "Answer the index of the first element of the receiver
+    for which aBlock evaluates as true."
+
+    | index |
+    index := 1.
+    self do: [ :el | (aBlock value: el) ifTrue: [^index].  index := index + 1].
+
+    ^0
+!
+
+findLast: aBlock
+    "Answer the index of the last element of the receiver
+    for which aBlock evaluates as true."
+
+    | index last |
+    index := 1.
+    last := 0.
+    self do: [ :el | (aBlock value: el) ifTrue: [last := index].  index := index + 1].
+    ^last
+!
+
+keysAndValuesDo: aBlock  
+    "Evaluate aBlock with each of the receiver's key/value pairs
+    (e.g. indexes and elements) as the arguments."
+
+    | index |
+    index := 1.
+    self do: [:el | aBlock value: index value: el.  index := index + 1]
+! !
+
+!Iterator methodsFor:'private'!
+
+block: aBlock
+    block := aBlock
+!
+
+species
+    ^OrderedCollection
+! !
+
+!Iterator class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic2/Iterator.st,v 1.2 1996-05-09 12:28:31 cg Exp $'
+! !