UnicodeReadWriteStream
Description
This is an adapter class used for bridging <UnicodeView>s with <ReadWriteStream>s. By default, this streams 'graphemes' which are user-perceived characters. A grapheme is represented in VAST by a <Grapheme> object.
Instance State
• refreshView: <Boolean> true if the internal view needs to be refreshed (i.e. write occurred)
Class Methods
on:
Answer a new instance of the receiver, streaming over argument
aUnicodeString.
Arguments:
aUnicodeString - <UnicodeString>
Answers:
<UnicodeReadWriteStream>
Instance Methods
asStream
Answer the receiver.
contents
Answer a Collection which is a copy collection that the receiver is
streaming over, truncated to the current position reference.
Example:
| stream |
stream := UnicodeReadWriteStream on: UnicodeString new.
stream nextPutAll: 'Smalltalk'.
self assert: [stream contents = 'Smalltalk']
Answers:
<UnicodeString>
next
Answer an Object that is the next accessible by the
receiver. Change the state of the receiver so that
returned object is no longer accessible.
Example:
self assert: [('Smalltalk' asUnicodeString readStream next; next; next) = $a asGrapheme].
self assert: [('Smalltalk' asUnicodeString readStream switchToUnicodeScalarMode; next; next; next) = $a asUnicodeScalar].
Answers:
<Object> view object
next:
Answer a collection containing the next @anInteger elements from the view.
If @anInteger < 1, an empty collection is answered
Example:
self assert: [('Smalltalk' asUnicodeString readStream next: 5) = 'Small'].
self assert: [| stream |
stream := 'Smalltalk' asUnicodeString readStream.
(stream switchToUnicodeScalarMode; next: 5) = 'Small' unicodeScalars contents]
Arguments:
anInteger - <Integer>
Answers:
<Object> instance of view collection class
Raises:
<Exception> ExCLDTIndexOutOfRange
next:into:startingAt:
Answer @anIndexedCollection with the next @anInteger number of items from
the receiver, stored starting at position @initialPosition.
If the receiver's state is such that there are fewer than anInteger
elements between its current position and the end of the stream,
the operation will fail, and the receiver will be left in a state
such that it answers true to the atEnd message.
Example:
| col |
col := Array new: 5.
'Smalltalk' asUnicodeString readStream next: 5 into: col startingAt: 1.
self assert: [col = 'Small' asUnicodeString asArray]
Arguments:
anInteger - <Integer>
anIndexedCollection - <Collection>
initialPosition - <Integer>
Answers:
<Collection> - anIndexedCollection
nextLine
Answer the elements between the current position and the next lineDelimiter.
Example:
| stream |
stream := ('Small' , String lf , 'talk' , String cr , 'er' , String crlf , 's') asUnicodeString readStream.
self assert: [stream nextLine = 'Small'].
self assert: [stream nextLine = 'talk'].
self assert: [stream nextLine = 'er'].
self assert: [stream nextLine = 's'].
stream switchToUnicodeScalarMode.
self assert: [stream nextLine = 'Small' unicodeScalars contents].
self assert: [stream nextLine = 'talk' unicodeScalars contents].
self assert: [stream nextLine = 'er' unicodeScalars contents].
self assert: [stream nextLine = 's' unicodeScalars contents].
self assert: stream atEnd.
Answers:
<Object> view-dependent
nextPut:
Store the argument anObject at the next position
accessible to the receiver. Answer anObject. Change the
state of the receiver so that the argument anObject is no
longer accessible.
This sets the 'refreshView' flag so we are sure to update
the view on a subsequent read.
Example:
self assert: [((UnicodeReadWriteStream on: UnicodeString new)
nextPut: $S;
nextPut: $T;
position: 0;
upToEnd) = 'ST']
Arguments:
anObject - <Object> @see implementors of #asGrapheme
Answers:
<Grapheme> anObject converted to Grapheme
nextPutAll:
Store each of the elements of aCollection starting at the current
position accessible to the receiver. Answer aCollection. Change
the state of the receiver so that the objects contained with
aCollection are no longer accessible.
This sets the 'refreshView' flag so we are sure to update
the view on a subsequent read.
Example:
self assert: [((UnicodeString new writeStream)
nextPutAll: 'Smalltalk' asUnicodeString;
position: 0;
upToEnd) = 'Smalltalk']
Arguments:
aCollection - <Object> @see implementors of #asUnicodeString
Answers:
<UnicodeString> aCollection converted to UnicodeString
peek
Answer an Object that is the next accessible by the receiver.
Change the state of the receiver so that returned object is no longer accessible.
Answer nil if the view is atEnd
Example:
self assert: [('' asUnicodeString readStream peek) isNil].
self assert: [('Smalltalk' asUnicodeString readStream peek) = $S asGrapheme].
self assert: [('Smalltalk' asUnicodeString readStream switchToUnicodeScalarMode; peek) = $S asUnicodeScalar].
Answers:
<Object> or nil if at end
position:
Set the receiver's position reference to argument anInteger.
Arguments:
anInteger - <Integer>
Answers:
<UnicodeWriteStream> receiver
Raises:
<Exception> ExCLDTIndexOutOfRange if anInteger is out of range
skip:
Increment the receiver's current reference position by anInteger.
Fail if anInteger is not a kind of Integer.
Example:
self assert: [('abcde' asUnicodeString readStream skip: 2; upToEnd) = 'cde']
Arguments:
anInteger - <Integer>
Raises:
<Exception> ExCLDTIndexOutOfRange
skipTo:
Read and discard elements just past the occurrence of @anObject.
Example:
self assert: [('abcde' asUnicodeString readStream skipTo: $c; upToEnd) = 'de'].
self assert: [('abcde' asUnicodeString readStream skipTo: $z; upToEnd) = '']
Arguments:
anObject - <Object>
Answers:
<Boolean> true if found, false otherwise
skipToAll:
Attempt to read and discard elements just past the occurrence of @aSequentialCollection.
Answer true if all elements in @aSequentialCollection occurred, else answer false.
Note:
If aSequentialCollection is an EsString, then we attempt ot convert to a UnicodeString
Example:
self assert: ['abcde' asUnicodeString readStream skipToAll: 'bc'].
self assert: [('abcde' asUnicodeString readStream skipToAll: 'bc'; upToEnd) = 'de'].
self assert: [('abcde' asUnicodeString readStream skipToAll: 'zzz') not].
self assert: [('abcde' asUnicodeString readStream skipToAll: 'zzz'; upToEnd) = ''].
Arguments:
aSequentialCollection - <aSequentialCollection>
Answers:
<Boolean>
skipToAny:
Read and discard elements beyond the next occurrence
of an element that exists in @aSequentialCollection or if none,
to the end of stream.
Answer true if an element in @aSequentialCollection
occurred, else answer false.
Note:
If aSequentialCollection is an EsString, then we attempt ot convert to a UnicodeString
Example:
self assert: ['abcde' asUnicodeString readStream skipToAny: 'bd'].
self assert: [('abcde' asUnicodeString readStream skipToAny: 'bd'; upToEnd) = 'cde'].
self assert: [('abcde' asUnicodeString readStream skipToAny: 'zzz') not].
self assert: [('abcde' asUnicodeString readStream skipToAny: 'zzz'; upToEnd) = ''].
Arguments:
aSequentialCollection - <aSequentialCollection>
Answers:
<Boolean>
truncate
Set the size of the receiver stream to its current position.
Example:
| stream |
stream := ReadWriteStream on: UnicodeString new.
stream nextPutAll: 'Smalltalk'.
self assert: [stream contents = 'Smalltalk'].
stream position: 5.
self assert: [stream contents = 'Smalltalk'].
stream truncate.
self assert: [stream contents = 'Small'].
upTo:
Answers a collection of all of the objects in the view
beginning from the current position up to, but not including,
@anObject.
Example:
self assert: [('abcde' asUnicodeString readStream upTo: $c) = 'ab'].
self assert: [('abcde' asUnicodeString readStream upTo: $z) = 'abcde']
Arguments:
anObject - <Object>
Answers:
<Object> instance of view collection class
upToAll:
Answers a collection of all of the objects in the view beginning from the current position up to,
but not including, @aSequenceableCollection
Note:
If aSequenceableCollection is an EsString, then we attempt ot convert to a UnicodeString
Example:
self assert: [('abcde' asUnicodeString readStream upToAll: 'bc') = 'a'].
self assert: [('abcde' asUnicodeString readStream upToAll: 'bc'; upToEnd) = 'de'].
self assert: [('abcde' asUnicodeString readStream upToAll: 'zzz') = 'abcde'].
self assert: [('abcde' asUnicodeString readStream upToAll: 'zzz'; upToEnd) isEmpty].
Arguments:
aSequenceableCollection - <SequenceableCollection>
Answers:
<Object> instance of view collection class
upToAny:
Answers a collection of all of the objects in the view up to, but not including, the next occurrence
of the element that exists in @aSequenceableCollection. If the element that exists in @aSequenceableCollection
is not found and the end of the view is encountered, a collection of the objects read is returned.
Note:
If aSequenceableCollection is an EsString, then we attempt ot convert to a UnicodeString
Example:
self assert: [('abcde' asUnicodeString readStream upToAny: 'bd') = 'a'].
self assert: [('abcde' asUnicodeString readStream upToAny: 'bd'; upToEnd) = 'cde'].
self assert: [('abcde' asUnicodeString readStream upToAny: 'zzz') = 'abcde'].
self assert: [('abcde' asUnicodeString readStream upToAny: 'zzz'; upToEnd) isEmpty].
Arguments:
aSequenceableCollection - <SequenceableCollection>
Answers:
<Object> view collection class
upToEnd
Answer a collection containing UP TO the maximum number of elements read from the view.
If there are no more elements available to be read, then an empty collection is answered.
Example:
self assert: ['abcde' asUnicodeString readStream upToEnd = 'abcde'].
self assert: [('abcde' asUnicodeString readStream next: 2; upToEnd) = 'cde'].
self assert: ['' asUnicodeString readStream upToEnd = '']
Answers:
<Object> instance of view collection class
Last modified date: 01/18/2023