core/Xtreams__WriteStream.st
author mkobetic
Mon, 30 Jan 2012 22:33:34 +0000
changeset 74 752e2d88fe73
parent 55 e44717ae3e6c
child 94 7e6a328c5f8b
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/core' }"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
Object subclass:#WriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'destination'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:'Backspace Bell CarriageReturn Delete DoubleQuote Escape FormFeed
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
		LineFeed Quote Space Tab VerticalTab'
36
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
     9
	poolDictionaries:'XtreamsPool'
20
51de794993c3 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 7
diff changeset
    10
	category:'Xtreams-Core'
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
WriteStream comment:'Abstract superclass of all write streams; defines the API.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
Write streams are created by sending #writing to a concrete resource (a.k.a terminal), such as a Collection, SocketAccessor, Filename, etc.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	String new writing write: ''testing''; close; terminal
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
Transform write streams are created through one of the messages in the ''transforming'' protocol sent to other write streams.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
	(String new writing collecting: #asUppercase) write: ''testing''; close; terminal
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
Subclasses must implement the following messages:
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
	#read:into:at:
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	#contentsSpecies
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
Instance Variables
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
	destination     <Object> a stream or "terminal" consuming written elements
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
Shared Variables
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
	Backspace       <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	Bell    <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
	CarriageReturn  <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
	Delete  <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
	DoubleQuote     <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	Escape  <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
	FormFeed        <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	LineFeed        <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	Quote   <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
	Space   <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
	Tab     <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
	VerticalTab     <Character>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
!WriteStream class methodsFor:'instance creation'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
on: aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
	^self new on: aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
!WriteStream class methodsFor:'class initialization'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
initialize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
        Backspace := String with: Character backspace.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
        Bell := String with: (Character value: 7).
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
        CarriageReturn := String with: (Character value: 13).
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
        Delete := String with: (Character value: 127).
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
        DoubleQuote := String with: $".
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
        Escape := String with: (Character value: 27).
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
        FormFeed := String with: Character newPage.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
        LineFeed := String with: Character lf.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
        Quote := String with: $'.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
        Space := String with: Character space.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
        Tab := String with: Character tab.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
        VerticalTab := String with: (Character value: 11)
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
!WriteStream methodsFor:'accessing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
conclusion
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
	"Close the stream and return the object at the bottom of the stream."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
	"       ^<Collection | Buffer | IOAccessor | BlockClosure> "
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
	self close.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	^self terminal
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
	^destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
insert: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
	"Insert aStreamable into self at current position."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
	"       aStreamable     <SequenceableCollection | ReadStream | Buffer>  the source to write in to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
		^<Integer>      the number of elements written to the destination"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
		' World!!' copy writing insert: 'Hello' reading; -= 0; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
	^aStreamable streamingInsertInto: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
insert: anInteger from: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
	"Insert anIntegers worth of elements from aStreamable into self at current position."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
	"       anInteger       <Integer>       the number of elements to insert
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
		aStreamable     <ReadStream | SequenceableCollection | Buffer > the source to write into the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
		startIndex      <Integer>       the index into aSequenceableCollection to start writing from
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
		^<Integer>      number of elements inserted
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
	""
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
		' World!!' copy writing insert: 5 from: 'Hello Underworld!!' reading; -= 0; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	aStreamable streamingInsert: anInteger into: self.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
insert: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
	"Insert anIntegers worth of elements from aSequenceableCollection starting at startIndex into self at current position."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
	"       anInteger       <Integer>       the number of elements to insert
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
		aStreamable     <SequenceableCollection>        the source to write into the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
		startIndex      <Integer>       the index into aSequenceableCollection to start writing from
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
		^<Integer>      number of elements inserted
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
	""
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
		' World!!' copy writing insert: 5 from: 'Hello' at: 1; -= 0; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
	self write: anInteger from: aSequenceableCollection at: startIndex.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
put: anObject
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
	"Write anObject into self."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
	"       anObject                <Object>        the object to write in to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
		^                               <Object>        the object that was written to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
	""
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
		String new writing put: $h; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
	| cache |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
	cache := self contentsSpecies newRecycled: 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   130
	cache at: 1 put: anObject.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   131
	self write: 1 from: cache at: 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   132
	cache recycle.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   133
	^anObject
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   134
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   135
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   136
terminal
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   137
	"Return the object at the bottom of the stream."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   138
	"       ^<Collection | Buffer | IOAccessor | BlockClosure>
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   139
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   140
	^(destination isKindOf: WriteStream)
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   141
		ifTrue: [ destination terminal ]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   142
		ifFalse: [ destination ]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   143
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   144
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   145
write: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   146
	"Write aStreamable into self."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   147
	"       aStreamable     <SequenceableCollection | ReadStream | Buffer>  the source to write in to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   148
		^<Integer>      the number of elements written to the destination"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   149
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   150
		String new writing write: 'Hello' reading; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   151
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   152
	^aStreamable streamingWriteInto: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   153
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   154
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   155
write: anInteger from: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   156
	"Write anInteger's worth of elements from aStreamable into self."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   157
	"       anInteger       <Integer>       the number of elements to write
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   158
		aStreamable     <SequenceableCollection | ReadStream | Buffer>  the source to write in to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   159
		^<Integer>      number of elements written
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   160
	""
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   161
		String new writing write: 3 from: 'Hello' reading; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   162
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   163
	^aStreamable streamingWrite: anInteger into: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   164
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   165
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   166
write: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   167
	"Write anIntegers worth of elements from aSequenceableCollection starting at startIndex into self."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   168
	"       anInteger       <Integer>       the number of elements to write
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   169
		aStreamable     <SequenceableCollection>        the source to write in to the destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   170
		startIndex      <Integer>       the index into aSequenceableCollection to start writing from
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   171
		^<Integer>      number of elements written
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   172
	""
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   173
		String new writing write: 3 from: 'Hello' at: 2; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   174
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   175
	^self subclassResponsibility
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   176
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   177
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   178
!WriteStream methodsFor:'characters'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   179
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   180
backspace
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   181
	self write: Backspace
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   182
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   183
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   184
bell
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   185
	self write: Bell
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   186
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   187
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   188
cr
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   189
	self write: CarriageReturn
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   190
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   191
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   192
delete
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   193
	self write: Delete
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   194
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   195
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   196
escape
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   197
	self write: Escape
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   198
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   199
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   200
ff
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   201
	self write: FormFeed
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   202
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   203
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   204
lf
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   205
	self write: LineFeed
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   206
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   207
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   208
print: anObject
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   209
	anObject streamingPrintOn: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   210
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   211
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   212
q
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   213
	self write: Quote
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   214
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   215
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   216
qq
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   217
	self write: DoubleQuote
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   218
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   219
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   220
space
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   221
	self write: Space
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   222
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   223
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   224
space: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   225
	anInteger timesRepeat: [self space]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   226
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   227
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   228
tab
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   229
	self write: Tab
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   230
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   231
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   232
tab: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   233
	anInteger timesRepeat: [self tab]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   234
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   235
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   236
vtab
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   237
	self write: VerticalTab
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   238
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   239
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   240
!WriteStream methodsFor:'converting'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   241
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   242
writing
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   243
	^[:object | self nextPut: object] writing
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   244
		contentsSpecies: self contentsSpecies;
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   245
		yourself
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   246
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   247
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   248
!WriteStream methodsFor:'initialize-release'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   249
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   250
close
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   251
	"Close the destination from any more writes."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   252
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   253
	self flush.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   254
	destination close
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   255
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   256
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   257
contentsSpecies
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   258
	"The class of collection that is able to hold the kind of elements that this stream consumes."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   259
	"       ^       <Class> collection class
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   260
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   261
	^self subclassResponsibility
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   262
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   263
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   264
flush
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   265
	"Make sure all the previously written elements are pushed down into the destination."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   266
	destination flush
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   267
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   268
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   269
on: aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   270
	destination := aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   271
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   272
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   273
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   274
!WriteStream methodsFor:'printing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   275
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   276
printOn: aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   277
	| stream |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   278
	stream := String new writing.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   279
	self streamingPrintOn: stream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   280
	aStream nextPutAll: stream conclusion.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   281
	aStream cr.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   282
	destination printOn: aStream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   283
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   284
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   285
streamingPrintOn: aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   286
	aStream write: self class name
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   287
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   288
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   289
!WriteStream methodsFor:'private'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   290
36
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   291
nextPut: anObject
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   292
	"This is here for compatibility with the existing StreamEncoders so that they can be re-used with transformation streams for encoding."
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   293
	self put: anObject.
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   294
	^anObject
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   295
!
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   296
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   297
nextPutAll: aCollection
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   298
	"This is here for compatibility with the existing StreamEncoders so that they can be re-used with transformation streams for encoding."
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   299
	self write: aCollection.
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   300
	^aCollection
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   301
!
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
   302
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   303
streamingInsert: anInteger from: aReadStream
29
mkobetic
parents: 20
diff changeset
   304
        | cache count |
mkobetic
parents: 20
diff changeset
   305
        cache := self contentsSpecies newRecycled: (anInteger max: DefaultBufferSize).
mkobetic
parents: 20
diff changeset
   306
        count := [aReadStream read: anInteger into: cache at: 1. anInteger] on: Incomplete do: [ :ex | ex count ].
mkobetic
parents: 20
diff changeset
   307
        self insert: count from: cache at: 1.
mkobetic
parents: 20
diff changeset
   308
        cache recycle.
mkobetic
parents: 20
diff changeset
   309
        count < anInteger ifTrue: [(Incomplete count: count) raise]
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   310
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   311
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   312
streamingInsertFrom: aReadStream
29
mkobetic
parents: 20
diff changeset
   313
        | count cache |
mkobetic
parents: 20
diff changeset
   314
        count := 0.
mkobetic
parents: 20
diff changeset
   315
        cache := self contentsSpecies newRecycled: DefaultBufferSize.
mkobetic
parents: 20
diff changeset
   316
        [[aReadStream read: cache size into: cache at: 1] on: Incomplete do: [:exception |
mkobetic
parents: 20
diff changeset
   317
                self insert: exception.
mkobetic
parents: 20
diff changeset
   318
                cache recycle.
mkobetic
parents: 20
diff changeset
   319
                ^count + exception count].
mkobetic
parents: 20
diff changeset
   320
        self insert: cache size from: cache at: 1.
mkobetic
parents: 20
diff changeset
   321
        count := count + cache size] repeat
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   322
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   323
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   324
streamingWrite: anInteger from: aReadStream
29
mkobetic
parents: 20
diff changeset
   325
        | cache toDo continue amount |
mkobetic
parents: 20
diff changeset
   326
        cache := self contentsSpecies newRecycled: DefaultBufferSize.
mkobetic
parents: 20
diff changeset
   327
        toDo := anInteger. continue := true.
mkobetic
parents: 20
diff changeset
   328
        [ continue and: [ toDo > 0 ] ] whileTrue: [
mkobetic
parents: 20
diff changeset
   329
                amount := [ aReadStream read: (cache size min: toDo) into: cache at: 1 ] on: Incomplete do: [ :ex | continue := false. ex count ].
mkobetic
parents: 20
diff changeset
   330
                self write: amount from: cache at: 1.
mkobetic
parents: 20
diff changeset
   331
                toDo := toDo - amount ].
mkobetic
parents: 20
diff changeset
   332
        cache recycle.
mkobetic
parents: 20
diff changeset
   333
        toDo > 0 ifTrue: [(Incomplete count: anInteger - toDo) raise].
mkobetic
parents: 20
diff changeset
   334
        ^anInteger
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   335
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   336
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   337
streamingWriteFrom: aReadStream
29
mkobetic
parents: 20
diff changeset
   338
        | count cache |
mkobetic
parents: 20
diff changeset
   339
        count := 0.
mkobetic
parents: 20
diff changeset
   340
        cache := self contentsSpecies newRecycled: DefaultBufferSize.
mkobetic
parents: 20
diff changeset
   341
        [[aReadStream read: cache size into: cache at: 1] on: Incomplete do: [:exception |
mkobetic
parents: 20
diff changeset
   342
                self write: exception.
mkobetic
parents: 20
diff changeset
   343
                cache recycle.
mkobetic
parents: 20
diff changeset
   344
                ^count + exception count].
mkobetic
parents: 20
diff changeset
   345
        self write: cache size from: cache at: 1.
mkobetic
parents: 20
diff changeset
   346
        count := count + cache size] repeat
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   347
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   348
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   349
!WriteStream methodsFor:'seeking'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   350
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   351
++ anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   352
	"Seek forward by anInteger elements. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   353
	"       anInteger       <Integer>       the number of elements to go forward by.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   354
		^<Integer>      the number of elements actually skipped
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   355
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   356
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   357
		'Hello Would' copy writing ++ 6; write: 'World'; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   358
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   359
	"Subclasses should reimplement this method if the stream is positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   360
	self isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   361
		ifFalse:        [Incomplete zero raise]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   362
		ifTrue: [self subclassResponsibility]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   363
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   364
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   365
+= anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   366
	"Seek from the start of the stream by anInteger elements. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   367
	"       anInteger       <Integer>       The number of elements to go forward by."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   368
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   369
		String new writing write: 'Hello Would'; += 6; write: 'World'; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   370
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   371
	^self position: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   372
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   373
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   374
-- anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   375
	"Seek backward by anInteger elements. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   376
	"       anInteger       <Integer>       The number of elements to go back by."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   377
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   378
		String new writing write: 'helio'; -- 2; write: 'lo'; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   379
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   380
	"Subclasses should reimplement this method if the stream is positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   381
	self isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   382
		ifFalse:        [self error: 'This stream is not positionable.']
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   383
		ifTrue: [self subclassResponsibility]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   384
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   385
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   386
-= anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   387
	"Seek backwards from the end of the stream by anInteger elements. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   388
	"       anInteger       <Integer>       The number of elements to go back by.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   389
		^<Integer>      the number of elements actually skipped"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   390
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   391
		'Hello Would' copy writing -= 3; write: 'rld'; close; terminal
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   392
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   393
	| available |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   394
	available := anInteger min: self length.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   395
	self position: self length - available.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   396
	available = anInteger ifTrue: [ ^anInteger ].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   397
	^(Incomplete count: available) raise
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   398
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   399
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   400
available
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   401
	"Return the number of elements from the current position to the end of the stream. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   402
	"       ^       <Integer>       the number of elements available"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   403
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   404
		String new writing write: 'Hello World'; -- 5; available
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   405
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   406
	^self length - self position
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   407
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   408
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   409
explore: aBlock
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   410
	" Explore the stream within the block but return to where we started when the block completes. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   411
	"       aBlock  <BlockClosure>  defines the exploration activity
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   412
		^               <Object>        result of aBlock"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   413
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   414
		String new writing explore: [ :s | s write: 'Hello' ]; write: 'World'; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   415
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   416
	| position |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   417
	position := self position.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   418
	^[aBlock cull: self] ensure: [self position: position]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   419
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   420
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   421
length
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   422
	"Return total length of the stream. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   423
	"       ^       <Integer>       the total number of elements in the stream. (position + available)"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   424
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   425
		'Hello World' copy writing ++ 5; length
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   426
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   427
	"Subclasses should reimplement this method if the stream is positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   428
	^self isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   429
		ifFalse:        [self error: 'This stream is not positionable.']
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   430
		ifTrue: [self subclassResponsibility]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   431
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   432
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   433
position
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   434
	"Return current position of the stream. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   435
	"       ^       <Integer>       current position of the stream."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   436
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   437
		'Hello World' copy writing -= 5; position
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   438
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   439
	"Subclasses should reimplement this method if the stream is positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   440
	^self isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   441
		ifFalse:        [self error: 'This stream is not positionable.']
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   442
		ifTrue: [self subclassResponsibility]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   443
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   444
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   445
position: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   446
	"Change current position of the stream to anInteger. The stream must be positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   447
	"       anInteger       <Integer>       current position of the stream."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   448
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   449
		'Hello Would' copy writing position: 6; write: 'World'; close; destination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   450
	"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   451
	"Subclasses should reimplement this method if the stream is positionable."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   452
	self isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   453
		ifFalse:        [self error: 'This stream is not positionable.']
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   454
		ifTrue: [self subclassResponsibility]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   455
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   456
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   457
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   458
!WriteStream methodsFor:'testing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   459
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   460
isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   461
	"Can this stream be positioned. Positionable streams come with extra API: #position, #position:, etc."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   462
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   463
	^false
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   464
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   465
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   466
isReadable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   467
	^false
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   468
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   469
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   470
isWritable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   471
	^true
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   472
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   473
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   474
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   475
!WriteStream class methodsFor:'documentation'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   476
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   477
version_SVN
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   478
    ^ '$Id$'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   479
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   480
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   481
WriteStream initialize!