substreams/Xtreams__StitchWriteStream.st
author joe
Fri, 15 Mar 2013 19:54:41 -0400
changeset 113 c0df9d2ad5d3
parent 109 9587e2df7029
permissions -rw-r--r--
* make InifiniteReadingWritingTests abstract

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

"{ NameSpace: Xtreams }"

WriteStream subclass:#StitchWriteStream
	instanceVariableNames:'active contentsSpecies'
	classVariableNames:''
	poolDictionaries:''
	category:'Xtreams-Substreams'
!

StitchWriteStream comment:'StitchWriteStream combines a stream of source which returns streams in to a single continuous stream.

Instance Variables
	active  <WriteStream>   the substream that is currently active
	contentsSpecies <Class> the contents species of the substreams

'
!


!StitchWriteStream class methodsFor:'instance creation'!

on: aDestination contentsSpecies: aClass
	^self new on: aDestination contentsSpecies: aClass
!

on: aDestination first: firstActiveStream
	^self new on: aDestination first: firstActiveStream
! !

!StitchWriteStream methodsFor:'accessing'!

write: anInteger from: aSequenceableCollection at: startIndex
	| remaining amount index |
	index := startIndex.
	remaining := anInteger.
	amount := 0.
	[
		active == nil ifTrue: [
			[active := destination get]
				on: Incomplete
				do: [ :ex | (Incomplete on: aSequenceableCollection count: anInteger - remaining at: startIndex) raise]].
		amount := [active write: remaining from: aSequenceableCollection at: index] on: Incomplete do: [:ex | ex count].
		remaining := remaining - amount.
		index := index + amount.
		remaining > 0] whileTrue:
			[active close.
			active := nil].
	^anInteger
! !

!StitchWriteStream methodsFor:'initialize-release'!

close
	self flush.
	destination close
!

contentsSpecies
	^contentsSpecies
!

flush
	active == nil ifTrue: [^self].
	active close.
	active := nil
!

on: aDestination contentsSpecies: aClass
	super on: aDestination.
	contentsSpecies := aClass
!

on: aDestination first: firstActiveStream
	super on: aDestination.
	active := firstActiveStream.
	contentsSpecies := active contentsSpecies
! !

!StitchWriteStream class methodsFor:'documentation'!

version_HG

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