terminals/Xtreams__SequenceableCollectionReadStream.st
author Martin Kobetic
Sun, 17 Nov 2013 00:22:31 -0500
changeset 144 e193a6772be4
parent 109 9587e2df7029
permissions -rw-r--r--
merging

"{ Package: 'stx:goodies/xtreams/terminals' }"

"{ NameSpace: Xtreams }"

ReadStream subclass:#SequenceableCollectionReadStream
	instanceVariableNames:'position'
	classVariableNames:''
	poolDictionaries:''
	category:'Xtreams-Terminals'
!

SequenceableCollectionReadStream comment:'Read stream on a sequenceable collection.
{{{
	(1 to: 10000) reading ++ 1000; read: 5
}}}

Instance Variables
	position        <Integer> current position of the stream

'
!


!SequenceableCollectionReadStream methodsFor:'accessing'!

get
	position = source size ifTrue: [Incomplete zero raise].
	position := position + 1.
	^source at: position
!

read: anInteger into: aSequenceableCollection at: startIndex
	| count |
	count := anInteger min: self available.
	aSequenceableCollection replaceFrom: startIndex to: startIndex + count - 1 with: source startingAt: position + 1.
	position := position + count.
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
	^anInteger
! !

!SequenceableCollectionReadStream methodsFor:'initialize-release'!

close
!

contentsSpecies
	^source species
!

on: aSequenceableCollection
	super on: aSequenceableCollection.
	position := 0
! !

!SequenceableCollectionReadStream methodsFor:'printing'!

streamingPrintOn: aStream
	| tail head |
	super streamingPrintOn: aStream.
	tail := position min: 5.
	head := (source size - position) min: (10 - tail).
	aStream
		write: ' position: ';
		print: position;
		write: ' size: ';
		print: source size;
		cr; tab;
		write: (position > 5 ifTrue: ['...'] ifFalse: ['']);
		print: (source copyFrom: position + 1 - tail to: position);
		write: '  |  ';
		print: (source copyFrom: position + 1 to: position + head);
		write: (source size - position > (10 - tail) ifTrue: ['...'] ifFalse: [''])
! !

!SequenceableCollectionReadStream methodsFor:'private'!

streamingInsert: anInteger into: aWriteStream
	| count |
	anInteger isZero ifTrue: [^self].
	count := anInteger min: self available.
	aWriteStream insert: count from: source at: position + 1.
	position := position + count.
	count >= anInteger ifTrue: [^self].
	(Incomplete on: source count: count at: position - count + 1) raise
!

streamingInsertInto: aWriteStream
	| count |
	(count := self available) isZero ifTrue: [Incomplete zero raise].
	self streamingInsert: count into: aWriteStream.
	^count
!

streamingWrite: anInteger into: aWriteStream
	| count |
	anInteger isZero ifTrue: [^0].
	count := anInteger min: self available.
	aWriteStream write: count from: source at: position + 1.
	position := position + count.
	count = anInteger ifTrue: [^anInteger].
	(Incomplete on: source count: count at: position - count + 1) raise
!

streamingWriteInto: aWriteStream
	| count |
	(count := self available) isZero ifTrue: [^self].
	self streamingWrite: count into: aWriteStream.
	^count
! !

!SequenceableCollectionReadStream methodsFor:'seeking'!

++ anInteger
	| count |
	anInteger < 0 ifTrue: [ ^self -- anInteger negated ].
	count := self available min: anInteger.
	position := position + count.
	count < anInteger ifTrue: [(Incomplete count: count) raise].
	^anInteger
!

-- anInteger
	| count |
	anInteger < 0 ifTrue: [ ^self ++ anInteger negated ].
	count := position min: anInteger.
	position := position - count.
	count = anInteger ifTrue: [^anInteger].
	(Incomplete count: count) raise
!

length
	^source size
!

position
	" Return a bookmark for the current stream state. "

	^position
!

position: aPosition

	aPosition < 0 ifTrue: [ Incomplete zero raise ].
	position := aPosition min: self length.
	position = aPosition ifTrue: [^aPosition ].
	(Incomplete count: position) raise
! !

!SequenceableCollectionReadStream methodsFor:'testing'!

isPositionable
	^true
! !

!SequenceableCollectionReadStream class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !