terminals/stx_goodies_xtreams_terminals.st
author Martin Kobetic
Sun, 17 Nov 2013 00:21:39 -0500
changeset 141 263190106319
parent 137 ef21c6ae6329
permissions -rw-r--r--
merging
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/terminals' }"
a1363827b596 packaging
mkobetic
parents:
diff changeset
     2
a1363827b596 packaging
mkobetic
parents:
diff changeset
     3
LibraryDefinition subclass:#stx_goodies_xtreams_terminals
a1363827b596 packaging
mkobetic
parents:
diff changeset
     4
	instanceVariableNames:''
a1363827b596 packaging
mkobetic
parents:
diff changeset
     5
	classVariableNames:''
a1363827b596 packaging
mkobetic
parents:
diff changeset
     6
	poolDictionaries:''
a1363827b596 packaging
mkobetic
parents:
diff changeset
     7
	category:'* Projects & Packages *'
a1363827b596 packaging
mkobetic
parents:
diff changeset
     8
!
a1363827b596 packaging
mkobetic
parents:
diff changeset
     9
87
mkobetic
parents: 80
diff changeset
    10
stx_goodies_xtreams_terminals comment:'Terminals are the objects at the bottom of stream stacks. These are the ultimate sources of elements produced by read streams or ultimate consumers of elements written into write streams. This package provides support for various kinds of terminals available in VisualWorks. Eventual ports to other dialects may support different set of terminals although there will likely be significant overlap. However, implementations may have subtle differences as well. For example streams in Squeak/Pharo do not use become: when they grow the underlying collection of a collection stream. Therefore code assuming that identity of a collection stream terminal will be preserved may not be portable.
mkobetic
parents: 80
diff changeset
    11
mkobetic
parents: 80
diff changeset
    12
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    13
	== Collections ==
87
mkobetic
parents: 80
diff changeset
    14
mkobetic
parents: 80
diff changeset
    15
Collections are traditional stream terminals. Read streams are created by sending #reading to a collection.
mkobetic
parents: 80
diff changeset
    16
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    17
	(1 to: 10000) reading ++ 1000; read: 5
87
mkobetic
parents: 80
diff changeset
    18
}}}
mkobetic
parents: 80
diff changeset
    19
Similarly write streams are created by sending #writing to a collection. The collection is grown automatically to accommodate any elements written. Closing a collection write stream will truncate the collection to the current stream position. This behavior is useful as a replacement for the traditional #contents message. The contents can be accessed with the #terminal message after the stream is closed. The advantage is that the sequence #close and #terminal (or the shortcut #conclusion) can be sent to arbitrary stream stack and behaves consistently.
mkobetic
parents: 80
diff changeset
    20
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    21
	String new writing write: ''Hello World''; -- 6; conclusion
87
mkobetic
parents: 80
diff changeset
    22
}}}
mkobetic
parents: 80
diff changeset
    23
mkobetic
parents: 80
diff changeset
    24
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    25
	== Block Closures ==
87
mkobetic
parents: 80
diff changeset
    26
mkobetic
parents: 80
diff changeset
    27
Streaming over block closures is proving to be "xtremely" versatile tool, allowing to stream over result sets of arbitrary computations, modelling infinite streams, etc.
mkobetic
parents: 80
diff changeset
    28
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    29
	"inifinite stream of ones"
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    30
	[ 1 ] reading read: 20
87
mkobetic
parents: 80
diff changeset
    31
}}}
mkobetic
parents: 80
diff changeset
    32
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    33
	"Fibonacci"
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    34
	| a b | a := 0. b := 1.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    35
	[ | x | x := a. a := b. b := x + a. x ] reading ++ 500; get
87
mkobetic
parents: 80
diff changeset
    36
}}}
mkobetic
parents: 80
diff changeset
    37
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    38
	"Streaming over ObjectMemory"
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    39
	x := ObjectMemory someObject.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    40
	[ x := ObjectMemory nextObjectAfter: x ] reading read: 5
87
mkobetic
parents: 80
diff changeset
    41
}}}
mkobetic
parents: 80
diff changeset
    42
mkobetic
parents: 80
diff changeset
    43
Single argument blocks can be used as read terminals too, which turn an iterative process in to a stream.
mkobetic
parents: 80
diff changeset
    44
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    45
	"In this example, we have a -hard- loop, not using collection protocol, which will only run one element at a time."
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    46
	[:out | 1 to: 10 do: [:i | out put: i]] reading read: 5.
87
mkobetic
parents: 80
diff changeset
    47
}}}
mkobetic
parents: 80
diff changeset
    48
mkobetic
parents: 80
diff changeset
    49
Single argument blocks can be used as write terminals.
mkobetic
parents: 80
diff changeset
    50
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    51
	"Transcript as an xtream"
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
    52
	[ :x | Transcript nextPut: x ] writing write: ''Hello World!!!!''
87
mkobetic
parents: 80
diff changeset
    53
}}}
mkobetic
parents: 80
diff changeset
    54
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    55
	"/dev/null"
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
    56
	[ :x | ] writing write: ''Hello World!!!!''
87
mkobetic
parents: 80
diff changeset
    57
}}}
mkobetic
parents: 80
diff changeset
    58
Combined with stream transforms like #doing: and #limiting:, a block closure stream can be used to transform arbitrary loop into a stream and the streaming API can provide fine grained control over the execution of the loop body.
mkobetic
parents: 80
diff changeset
    59
mkobetic
parents: 80
diff changeset
    60
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    61
	== Files ==
87
mkobetic
parents: 80
diff changeset
    62
mkobetic
parents: 80
diff changeset
    63
File read streams are created by sending #reading to a Filename. However the actual terminal is an IOAccessor. The original filename is accessible through the IOAccessor.
mkobetic
parents: 80
diff changeset
    64
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    65
	| file |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    66
	file := ObjectMemory imageName asFilename reading.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    67
	[ file read: 13 ] ensure: [ file close ]
87
mkobetic
parents: 80
diff changeset
    68
}}}
mkobetic
parents: 80
diff changeset
    69
As a convenience, sending #reading to a Filename of a directory will create a stream of all filenames in that directory.
mkobetic
parents: 80
diff changeset
    70
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    71
	''/tmp'' asFilename reading rest
87
mkobetic
parents: 80
diff changeset
    72
}}}
mkobetic
parents: 80
diff changeset
    73
File write streams can be created via the usual #writing message or via #appending which opens the file in appending mode. In appending mode, you cannot position the stream before the end of the file contents, so you can never overwrite existing contents. In writing mode, the file will be truncated at stream''s current position when #close is called. To keep the entire contents of the file, use -= 0 to skip to the end before closing. This behavior is different from the classic streams which would erase the contents of the file on open.
mkobetic
parents: 80
diff changeset
    74
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    75
	| file |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    76
	file := ''/dev/shm/xtreams-test'' asFilename.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    77
	[       file writing write: ''Hello''; close.
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
    78
		file appending write: '' World!!!!''; close.
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    79
		file contentsOfEntireFile.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    80
	] ensure: [ file delete ]
87
mkobetic
parents: 80
diff changeset
    81
}}}
mkobetic
parents: 80
diff changeset
    82
It is also possible to send #reading or #writing to a pre-opened IOAcccessor if some other opening mode configuration is desirable. For example to emulate the classic write stream opening behavior, you can use the following:
mkobetic
parents: 80
diff changeset
    83
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    84
	(IOAccessor openFileNamed: ''/dev/shm/xtreams-test''
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    85
		direction: IOAccessor writeOnly
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    86
		creation: IOAccessor truncateOrCreate
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    87
	) writing close
87
mkobetic
parents: 80
diff changeset
    88
}}}
mkobetic
parents: 80
diff changeset
    89
mkobetic
parents: 80
diff changeset
    90
Bare file streams are always binary. An encoding transform has to be applied to translate bytes into characters, which is discussed in more detail in [Xtreams-Transforms]. However for some types of encoding it is possible to use ByteStrings instead of ByteArrays to get similar effect. E.g reading from a file into a ByteString is like applying ISO8859-1 encoding on the fly. It can also be quite a bit faster than full blown encoding layer. However it does not do line-end translation and only few single-byte encodings are available (see the ByteString hierarchy). Similarly writing into a bare file stream from a ByteString works as if the characters were automatically encoded with ISO-8859-1. This is again without line end translation, so normally you would end up with CRs (code 13) in your file, which these days does not match any OS convention (Unixes and MacOS use LF, and Windows uses CRLFs).
mkobetic
parents: 80
diff changeset
    91
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    92
	| file header |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    93
	file := ObjectMemory imageName asFilename reading.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    94
	header := ByteString new writing.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    95
	[ header write: 20 from: file ] ensure: [ file close ].
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
    96
	header conclusion
87
mkobetic
parents: 80
diff changeset
    97
}}}
mkobetic
parents: 80
diff changeset
    98
mkobetic
parents: 80
diff changeset
    99
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   100
	== Sockets and Pipes ==
87
mkobetic
parents: 80
diff changeset
   101
mkobetic
parents: 80
diff changeset
   102
Sockets and Pipes are very similar, both accessed via IOAccessors again. The examples below show how data can be sent through a TCP or pipe connection by setting up a read stream and a write stream on a pair of connected accessors.
mkobetic
parents: 80
diff changeset
   103
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   104
	[ :in :out |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   105
		[       out writing write: ''Hello''; close.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   106
			in reading read: 5
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   107
		] ensure: [ in close. out close ]
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   108
	] valueWithArguments: SocketAccessor openPair
87
mkobetic
parents: 80
diff changeset
   109
}}}
mkobetic
parents: 80
diff changeset
   110
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   111
	[ :in :out |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   112
		[       out writing write: ''Hello''; close.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   113
			in reading read: 5
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   114
		] ensure: [ in close. out close ]
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   115
	] valueWithArguments: OSSystemSupport concreteClass pipeAccessorClass openPair
87
mkobetic
parents: 80
diff changeset
   116
}}}
mkobetic
parents: 80
diff changeset
   117
Same rules regarding binary vs text reading/writing applies to socket and pipe streams as was discussed with regards to file streams above.
mkobetic
parents: 80
diff changeset
   118
mkobetic
parents: 80
diff changeset
   119
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   120
	== Buffers ==
87
mkobetic
parents: 80
diff changeset
   121
mkobetic
parents: 80
diff changeset
   122
Buffers are used internally by Xtreams, but they could be useful in other circumstances too. There are several kinds and they can be used as both read and write stream terminals at the same time (not concurrently by multiple processes though, process synchronization has to managed explicitly via an external semaphore if necessary). For example writing into ElasticBuffer will grow it as much as necessary, but reading frees the space back up and it is immediately reused for further writes. So with interleaved reads and writes the size of the buffer will only grow to accommodate the maximum size written but not read yet.
mkobetic
parents: 80
diff changeset
   123
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   124
	buffer := ElasticBuffer on: String new.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   125
	bufferIn := buffer writing.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   126
	bufferOut := buffer reading.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   127
	100000 timesRepeat: [ bufferIn write: ''Hello World''. bufferOut read: 11 ].
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   128
	buffer cacheSize
87
mkobetic
parents: 80
diff changeset
   129
}}}
mkobetic
parents: 80
diff changeset
   130
mkobetic
parents: 80
diff changeset
   131
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   132
	== SharedQueues ==
87
mkobetic
parents: 80
diff changeset
   133
mkobetic
parents: 80
diff changeset
   134
SharedQueues are primarily used for data transfer between processes, their API is rather spartan though. Streams over SharedQueues provide the convenience of full streaming API.
mkobetic
parents: 80
diff changeset
   135
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   136
	queue := SharedQueue new.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   137
	in := queue reading.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   138
	out := queue writing.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   139
	received := Array new writing.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   140
	done := Semaphore new.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   141
	consumer :=
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   142
		[ | size |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   143
			[       (size := in get) isZero
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   144
			] whileFalse: [ | word |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   145
				word := ByteString new: size.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   146
				in read: size into: word.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   147
				received put: word ].
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   148
			done signal.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   149
		] fork.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   150
	#(one two three four) do: [ :word | out put: word size; write: word ].
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   151
	out put: 0.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   152
	done wait.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   153
	received conclusion
87
mkobetic
parents: 80
diff changeset
   154
}}}
mkobetic
parents: 80
diff changeset
   155
mkobetic
parents: 80
diff changeset
   156
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   157
	== CPointers ==
87
mkobetic
parents: 80
diff changeset
   158
mkobetic
parents: 80
diff changeset
   159
The ability to stream over external heap is useful when there''s a need to communicate larger amounts of objects of the same type with an external library. A common use case would be when there''s a need for a buffer that can be shared between Smalltalk and the external library conveniently. The CPointer stream allows to stream over a buffer allocated on the heap seamlessly as if it is a local smalltalk object. The elements of the stream are instances corresponding to the CType associated with the CPointer.
mkobetic
parents: 80
diff changeset
   160
{{{
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   161
	| buffer |
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   162
	buffer := CIntegerType unsignedChar malloc: 50.
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   163
	[       buffer writing
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   164
			length: 50;
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   165
			write: ''Hello World!!!!''.
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   166
		buffer reading
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   167
			length: 12;
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   168
			contentsSpecies: ByteString;
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   169
			rest
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   170
	] ensure: [ buffer free ]
87
mkobetic
parents: 80
diff changeset
   171
}}}
mkobetic
parents: 80
diff changeset
   172
The write streams behave similarly to collection write streams. They know their length and they will automatically attempt to reallocate and grow their heap space if necessary. Similarly closing the write stream will reallocate and shrink the write stream to its position at that time. It is possible to set length of a read stream as well to avoid running past the allocated memory accidentally. The stream will signal Incomplete when it reaches its end.
mkobetic
parents: 80
diff changeset
   173
'
mkobetic
parents: 80
diff changeset
   174
!
mkobetic
parents: 80
diff changeset
   175
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   176
a1363827b596 packaging
mkobetic
parents:
diff changeset
   177
!stx_goodies_xtreams_terminals class methodsFor:'description'!
a1363827b596 packaging
mkobetic
parents:
diff changeset
   178
a1363827b596 packaging
mkobetic
parents:
diff changeset
   179
excludedFromPreRequisites
a1363827b596 packaging
mkobetic
parents:
diff changeset
   180
    "list all packages which should be ignored in the automatic
a1363827b596 packaging
mkobetic
parents:
diff changeset
   181
     preRequisites scan. See #preRequisites for more."
a1363827b596 packaging
mkobetic
parents:
diff changeset
   182
a1363827b596 packaging
mkobetic
parents:
diff changeset
   183
    ^ #(
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   184
    )
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   185
!
a1363827b596 packaging
mkobetic
parents:
diff changeset
   186
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   187
mandatoryPreRequisites
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   188
    "list all required mandatory packages.
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   189
     Packages are mandatory, if they contain superclasses of the package's classes
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   190
     or classes which are extended by this package.
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   191
     This list can be maintained manually or (better) generated and
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   192
     updated by scanning the superclass hierarchies
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   193
     (the browser has a menu function for that)"
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   194
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   195
    ^ #(
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   196
        #'stx:goodies/xtreams/core'    "Xtreams::Buffer - extended "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   197
        #'stx:goodies/xtreams/support'    "XtreamsPool - shared pool used by Xtreams::ExternalReadStream "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   198
        #'stx:libbasic'    "Block - extended "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   199
        #'stx:libbasic2'    "Queue - extended "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   200
        #'stx:libview'    "DeviceGraphicsContext - extended "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   201
        #'stx:libwidg'    "EditTextView - extended "
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   202
    )
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   203
!
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   204
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   205
preRequisites
a1363827b596 packaging
mkobetic
parents:
diff changeset
   206
    "list all required packages.
a1363827b596 packaging
mkobetic
parents:
diff changeset
   207
     This list can be maintained manually or (better) generated and
a1363827b596 packaging
mkobetic
parents:
diff changeset
   208
     updated by scanning the superclass hierarchies and looking for
a1363827b596 packaging
mkobetic
parents:
diff changeset
   209
     global variable accesses. (the browser has a menu function for that)
a1363827b596 packaging
mkobetic
parents:
diff changeset
   210
     Howevery, often too much is found, and you may want to explicitely
a1363827b596 packaging
mkobetic
parents:
diff changeset
   211
     exclude individual packages in the #excludedFromPrerequisites method."
a1363827b596 packaging
mkobetic
parents:
diff changeset
   212
a1363827b596 packaging
mkobetic
parents:
diff changeset
   213
    ^ #(
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   214
	#'stx:goodies/xtreams/core'    "Xtreams::WriteStream - superclass of Xtreams::PointerWriteStream "
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   215
	#'stx:libbasic'    "Object - superclass of Xtreams::PointerWriteStream "
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   216
	#'stx:libbasic2'    "Queue - superclass of extended SharedQueue "
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   217
    )
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   218
!
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   219
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   220
referencedPreRequisites
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   221
    "list all packages containing classes referenced by the packages's members.
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   222
     This list can be maintained manually or (better) generated and
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   223
     updated by looking for global variable accesses
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   224
     (the browser has a menu function for that)
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   225
     However, often too much is found, and you may want to explicitely
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   226
     exclude individual packages in the #excludedFromPreRequisites method."
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   227
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   228
    ^ #(
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   229
    )
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   230
!
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   231
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   232
subProjects
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   233
    "list packages which are known as subprojects.
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   234
     The generated makefile will enter those and make there as well.
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   235
     However: they are not forced to be loaded when a package is loaded;
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   236
     for those, redefine requiredPrerequisites"
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   237
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   238
    ^ #(
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   239
        #'stx:goodies/xtreams/terminals/tests'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   240
    )
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   241
! !
a1363827b596 packaging
mkobetic
parents:
diff changeset
   242
a1363827b596 packaging
mkobetic
parents:
diff changeset
   243
!stx_goodies_xtreams_terminals class methodsFor:'description - contents'!
a1363827b596 packaging
mkobetic
parents:
diff changeset
   244
a1363827b596 packaging
mkobetic
parents:
diff changeset
   245
classNamesAndAttributes
a1363827b596 packaging
mkobetic
parents:
diff changeset
   246
    "lists the classes which are to be included in the project.
a1363827b596 packaging
mkobetic
parents:
diff changeset
   247
     Each entry in the list may be: a single class-name (symbol),
a1363827b596 packaging
mkobetic
parents:
diff changeset
   248
     or an array-literal consisting of class name and attributes.
a1363827b596 packaging
mkobetic
parents:
diff changeset
   249
     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
a1363827b596 packaging
mkobetic
parents:
diff changeset
   250
a1363827b596 packaging
mkobetic
parents:
diff changeset
   251
    ^ #(
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   252
        "<className> or (<className> attributes...) in load order"
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   253
        #'Xtreams::BlockClosureGenerateStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   254
        #'Xtreams::BlockClosureReadStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   255
        #'Xtreams::BlockClosureWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   256
        #'Xtreams::BufferReadStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   257
        #'Xtreams::BufferWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   258
        #'Xtreams::BufferedWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   259
        #'Xtreams::CollectionWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   260
        #'Xtreams::ExternalReadStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   261
        #'Xtreams::ExternalWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   262
        #'Xtreams::FileWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   263
        #'Xtreams::NullWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   264
        #'Xtreams::SequenceableCollectionReadStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   265
        #'Xtreams::SequenceableCollectionWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   266
        #'Xtreams::SharedQueueReadStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   267
        #'Xtreams::SharedQueueWriteStream'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   268
        #'stx_goodies_xtreams_terminals'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   269
        #'Xtreams::FileReadStream'
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   270
    )
a1363827b596 packaging
mkobetic
parents:
diff changeset
   271
!
a1363827b596 packaging
mkobetic
parents:
diff changeset
   272
a1363827b596 packaging
mkobetic
parents:
diff changeset
   273
extensionMethodNames
a1363827b596 packaging
mkobetic
parents:
diff changeset
   274
    "lists the extension methods which are to be included in the project.
a1363827b596 packaging
mkobetic
parents:
diff changeset
   275
     Entries are 2-element array literals, consisting of class-name and selector."
a1363827b596 packaging
mkobetic
parents:
diff changeset
   276
a1363827b596 packaging
mkobetic
parents:
diff changeset
   277
    ^ #(
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   278
        Block reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   279
        Block writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   280
        Collection writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   281
        Filename appending
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   282
        Filename reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   283
        Filename writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   284
        Random reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   285
        SequenceableCollection reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   286
        SequenceableCollection writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   287
        SharedQueue reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   288
        SharedQueue writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   289
        Socket accepting
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   290
        Socket reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   291
        Socket writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   292
        UndefinedObject writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   293
        #'Xtreams::Buffer' reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   294
        #'Xtreams::Buffer' writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   295
        #'Xtreams::WriteStream' buffering:
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   296
        PipeStream isActive
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   297
        PipeStream reading
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   298
        PipeStream writing
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   299
        TextCollector writing
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   300
    )
a1363827b596 packaging
mkobetic
parents:
diff changeset
   301
! !
a1363827b596 packaging
mkobetic
parents:
diff changeset
   302
137
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   303
!stx_goodies_xtreams_terminals class methodsFor:'description - project information'!
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   304
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   305
legalCopyright
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   306
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   307
        ^'Copyright 2010-2013 Cincom Systems, Martin Kobetic and Michael Lucas-Smith'
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   308
! !
ef21c6ae6329 - Xtreams::SequenceableCollectionWriteStream
Martin Kobetic
parents: 109
diff changeset
   309
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   310
!stx_goodies_xtreams_terminals class methodsFor:'documentation'!
a1363827b596 packaging
mkobetic
parents:
diff changeset
   311
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   312
version_HG
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   313
    ^ '$Changeset: <not expanded> $'
52
a1363827b596 packaging
mkobetic
parents:
diff changeset
   314
! !
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 108
diff changeset
   315