substreams/stx_goodies_xtreams_substreams.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:56:17 +0000
changeset 103 726bf2ca0b99
parent 86 292a718d7b13
child 109 9587e2df7029
permissions -rw-r--r--
Removed methods from FileHandle to make it compilable. Having methods there is not a good idea anyway.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/substreams' }"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     2
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     3
LibraryDefinition subclass:#stx_goodies_xtreams_substreams
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     4
	instanceVariableNames:''
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     5
	classVariableNames:''
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     6
	poolDictionaries:''
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     7
	category:'* Projects & Packages *'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     8
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
     9
86
mkobetic
parents: 76
diff changeset
    10
stx_goodies_xtreams_substreams comment:'Substreams are streams embedded in other streams. Often there are multiple substreams embedded sequentially in a parent stream (for example multipart MIME messages). This package allows efficient handling of common types of substreams.
mkobetic
parents: 76
diff changeset
    11
mkobetic
parents: 76
diff changeset
    12
        === Fixed size substreams (#limiting:) ===
mkobetic
parents: 76
diff changeset
    13
mkobetic
parents: 76
diff changeset
    14
Limiting substream starts at the position when the substream is created and ends when the specified number of elements is read or written.
mkobetic
parents: 76
diff changeset
    15
{{{
mkobetic
parents: 76
diff changeset
    16
        (''abcdefghijklmno'' reading limiting: 10) rest
mkobetic
parents: 76
diff changeset
    17
}}}
mkobetic
parents: 76
diff changeset
    18
{{{
mkobetic
parents: 76
diff changeset
    19
        | stream substream |
mkobetic
parents: 76
diff changeset
    20
        stream := String new writing.
mkobetic
parents: 76
diff changeset
    21
        substream := stream limiting: 5.
mkobetic
parents: 76
diff changeset
    22
        [ substream write: ''Hello World!!'' ] on: Incomplete do: [].
mkobetic
parents: 76
diff changeset
    23
        stream conclusion
mkobetic
parents: 76
diff changeset
    24
}}}
mkobetic
parents: 76
diff changeset
    25
mkobetic
parents: 76
diff changeset
    26
mkobetic
parents: 76
diff changeset
    27
        === Bounded substreams (#ending:/#ending:inclusive:) ===
mkobetic
parents: 76
diff changeset
    28
mkobetic
parents: 76
diff changeset
    29
Bounded substream ends when the argument matches the content passing through the stream. The argument can take one of the following forms:
mkobetic
parents: 76
diff changeset
    30
  * a block - evaluated with each element; the stream ends when the block returns true
mkobetic
parents: 76
diff changeset
    31
{{{
mkobetic
parents: 76
diff changeset
    32
        (''abcdefghijklmnopqrstuvxyz'' reading ending: [ :e | ''gmt'' includes: e ]) rest.
mkobetic
parents: 76
diff changeset
    33
}}}
mkobetic
parents: 76
diff changeset
    34
{{{
mkobetic
parents: 76
diff changeset
    35
        | stream substream |
mkobetic
parents: 76
diff changeset
    36
        stream := String new writing.
mkobetic
parents: 76
diff changeset
    37
        substream := stream ending: [ :e | ''gmt'' includes: e ].
mkobetic
parents: 76
diff changeset
    38
        [ substream write: ''abcdefghijklmnopqrstuvxyz'' ] on: Incomplete do: [].
mkobetic
parents: 76
diff changeset
    39
        stream conclusion
mkobetic
parents: 76
diff changeset
    40
}}}
mkobetic
parents: 76
diff changeset
    41
  * a collection - matched against the matching amount of last elements going through the stream; the stream ends when the collection matches
mkobetic
parents: 76
diff changeset
    42
{{{
mkobetic
parents: 76
diff changeset
    43
        (''abcdefghijklmnopqrstuvxyz'' reading ending: ''mno'' inclusive: true) rest.
mkobetic
parents: 76
diff changeset
    44
}}}
mkobetic
parents: 76
diff changeset
    45
{{{
mkobetic
parents: 76
diff changeset
    46
        | stream substream |
mkobetic
parents: 76
diff changeset
    47
        stream := String new writing.
mkobetic
parents: 76
diff changeset
    48
        substream := stream ending: ''mno''.
mkobetic
parents: 76
diff changeset
    49
        [ substream write: ''abcdefghijklmnopqrstuvxyz'' ] on: Incomplete do: [].
mkobetic
parents: 76
diff changeset
    50
        stream conclusion
mkobetic
parents: 76
diff changeset
    51
}}}
mkobetic
parents: 76
diff changeset
    52
  * any other object - the stream ends when an equal element passes through the stream"
mkobetic
parents: 76
diff changeset
    53
{{{
mkobetic
parents: 76
diff changeset
    54
        (''ab#cd#ef!!ABC##'' reading ending: $!!) rest.
mkobetic
parents: 76
diff changeset
    55
}}}
mkobetic
parents: 76
diff changeset
    56
{{{
mkobetic
parents: 76
diff changeset
    57
        | stream substream |
mkobetic
parents: 76
diff changeset
    58
        stream := String new writing.
mkobetic
parents: 76
diff changeset
    59
        substream := stream ending: $!!.
mkobetic
parents: 76
diff changeset
    60
        [ substream write: ''Hello World!! Bye World!!'' ] on: Incomplete do: [].
mkobetic
parents: 76
diff changeset
    61
        stream conclusion
mkobetic
parents: 76
diff changeset
    62
}}}
mkobetic
parents: 76
diff changeset
    63
There is also a longer form #ending:inclusive: which takes an additional Boolean argument determining if the matching elements should be part of the substream content or not. The short form assumes the matching elements should be omitted.
mkobetic
parents: 76
diff changeset
    64
{{{
mkobetic
parents: 76
diff changeset
    65
        (''abcdefghijklmnopqrstuvxyz'' reading ending: [ :e | ''gmt'' includes: e ] inclusive: true) rest.
mkobetic
parents: 76
diff changeset
    66
}}}
mkobetic
parents: 76
diff changeset
    67
{{{
mkobetic
parents: 76
diff changeset
    68
        | stream substream |
mkobetic
parents: 76
diff changeset
    69
        stream := String new writing.
mkobetic
parents: 76
diff changeset
    70
        substream := stream ending: [ :e | ''gmt'' includes: e ] inclusive: true.
mkobetic
parents: 76
diff changeset
    71
        [ substream write: ''abcdefghijklmnopqrstuvxyz'' ] on: Incomplete do: [].
mkobetic
parents: 76
diff changeset
    72
        stream conclusion
mkobetic
parents: 76
diff changeset
    73
}}}
mkobetic
parents: 76
diff changeset
    74
Finally, closing a substream doesn''t close the underlying stream by default. This is usually desirable because another substream is likely to follow so the main stream cannot be closed in that case. So in normal use the main stream is usually closed separately from the substreams. However, closing behavior of any substream can be modified through a custom closeBlock: if different behavior is desired.
mkobetic
parents: 76
diff changeset
    75
{{{
mkobetic
parents: 76
diff changeset
    76
        | limited |
mkobetic
parents: 76
diff changeset
    77
        limited := (String new writing limiting: 10) closeBlock: [ :stream | stream destination close ]; yourself.
mkobetic
parents: 76
diff changeset
    78
        [ limited write: Object comment ] on: Incomplete do: [ :ex | ].
mkobetic
parents: 76
diff changeset
    79
        limited close; terminal
mkobetic
parents: 76
diff changeset
    80
}}}
mkobetic
parents: 76
diff changeset
    81
mkobetic
parents: 76
diff changeset
    82
mkobetic
parents: 76
diff changeset
    83
        === Streams of substreams (slicing and stitching) ===
mkobetic
parents: 76
diff changeset
    84
mkobetic
parents: 76
diff changeset
    85
Slicing and Stitching is a meta-stream concept. Slicing breaks a stream with content that is delimited in some fashion (limiting:, ending:, etc) in to multiple substreams. The result of slicing is a read stream of substreams. Stitching is the inverse of slicing. It takes a read stream of streams and stiches those back together to look like a single continuous stream. Stitching a slicing stream will normally give the same result as the original underlying stream.
mkobetic
parents: 76
diff changeset
    86
mkobetic
parents: 76
diff changeset
    87
Here is an example that creates a slicing stream that cuts the input up into substreams of size 5.
mkobetic
parents: 76
diff changeset
    88
{{{
mkobetic
parents: 76
diff changeset
    89
        ((1 to: 49) reading limiting: 5) slicing collect: [ :slice | slice rest ]
mkobetic
parents: 76
diff changeset
    90
}}}
mkobetic
parents: 76
diff changeset
    91
Note that only the latest substream is active, previous substream is automatically depleted before next substream is created.
mkobetic
parents: 76
diff changeset
    92
Also note that since slicing always creates substreams, it is always a read stream, even if you''re slicing a write stream. Output of the slicing stream are the substreams. Again, only the latest substream is active. The previous substream is automatically closed before next substream is created.
mkobetic
parents: 76
diff changeset
    93
{{{
mkobetic
parents: 76
diff changeset
    94
        | samples slices |
mkobetic
parents: 76
diff changeset
    95
        samples := String new writing.
mkobetic
parents: 76
diff changeset
    96
        slices := (samples limiting: 3) slicing.
mkobetic
parents: 76
diff changeset
    97
        Date.MonthNames do: [ :month | [ slices get write: month ] on: Xtreams.Incomplete do: [] ].
mkobetic
parents: 76
diff changeset
    98
        samples conclusion
mkobetic
parents: 76
diff changeset
    99
}}}
mkobetic
parents: 76
diff changeset
   100
mkobetic
parents: 76
diff changeset
   101
In the following example the stream contains multiple messages delimited by $!! and each message has multiple parts ending with $#. We want to process each part as a stream of its own (this is a simplified version of how multipart messages are represented in MIME).
mkobetic
parents: 76
diff changeset
   102
{{{
mkobetic
parents: 76
diff changeset
   103
        | messages |
mkobetic
parents: 76
diff changeset
   104
        messages := (''ab#cd#ef!!ABC##'' reading ending: $!!) slicing.
mkobetic
parents: 76
diff changeset
   105
        messages collect: [ :message |
mkobetic
parents: 76
diff changeset
   106
                (message ending: $#) slicing collect: [ :part | part rest ] ]
mkobetic
parents: 76
diff changeset
   107
}}}
mkobetic
parents: 76
diff changeset
   108
Note that since only the last slice is active any sort of read-ahead will likely interfere with the expected behavior, e.g. if we used collecting: instead of collect: in the example above, it would not work.
mkobetic
parents: 76
diff changeset
   109
mkobetic
parents: 76
diff changeset
   110
To generate the "hash-bang" style message encoding used in previous example we don''t need any sort of end-detecting substream. Instead we need to emit the closing character when the substream is closed. There is a special "closing" substream and corresponding slicer for that as well.
mkobetic
parents: 76
diff changeset
   111
{{{
mkobetic
parents: 76
diff changeset
   112
        | connection messages |
mkobetic
parents: 76
diff changeset
   113
        connection := String new writing.
mkobetic
parents: 76
diff changeset
   114
        messages := (connection closing: [ connection put: $!! ]) slicing.
mkobetic
parents: 76
diff changeset
   115
        3 timesRepeat: [ | parts message |
mkobetic
parents: 76
diff changeset
   116
                message := messages get.
mkobetic
parents: 76
diff changeset
   117
                parts := (message closing: [ connection put: $# ]) slicing.
mkobetic
parents: 76
diff changeset
   118
                #(one two three four) do: [ :body | parts get write: body ] ].
mkobetic
parents: 76
diff changeset
   119
        connection conclusion
mkobetic
parents: 76
diff changeset
   120
}}}
mkobetic
parents: 76
diff changeset
   121
Stitching takes a read stream of streams and makes them behave as a single continuous stream. Following example takes the ''chunks'' and stitches them together.
mkobetic
parents: 76
diff changeset
   122
{{{
mkobetic
parents: 76
diff changeset
   123
        | chunks |
mkobetic
parents: 76
diff changeset
   124
        chunks := (#(''abc'' ''de'' '''' ''fghij'') collect: [ :c | c reading ]) reading.
mkobetic
parents: 76
diff changeset
   125
        chunks stitching rest
mkobetic
parents: 76
diff changeset
   126
}}}
mkobetic
parents: 76
diff changeset
   127
The stream of streams can be inifinite in which case the stitching stream is inifinite as well. For example the following stitching stream will not end.
mkobetic
parents: 76
diff changeset
   128
{{{
mkobetic
parents: 76
diff changeset
   129
        | main |
mkobetic
parents: 76
diff changeset
   130
        main := (1 to: 10) reading.
mkobetic
parents: 76
diff changeset
   131
        [ main limiting: 3 ] reading stitching rest
mkobetic
parents: 76
diff changeset
   132
}}}
mkobetic
parents: 76
diff changeset
   133
The problem is that the underlying stream of streams keeps producing empty limiting streams at the end of the main stream. To make the example end with an empty limiting stream can be done as follows.
mkobetic
parents: 76
diff changeset
   134
{{{
mkobetic
parents: 76
diff changeset
   135
        | main wasEmpty |
mkobetic
parents: 76
diff changeset
   136
        main := (1 to: 10) reading.
mkobetic
parents: 76
diff changeset
   137
        wasEmpty := false.
mkobetic
parents: 76
diff changeset
   138
        [       wasEmpty ifTrue: [ Incomplete zero raise ].
mkobetic
parents: 76
diff changeset
   139
                wasEmpty := true.
mkobetic
parents: 76
diff changeset
   140
                (main doing: [ :e | wasEmpty := false ]) limiting: 3
mkobetic
parents: 76
diff changeset
   141
        ] reading stitching rest
mkobetic
parents: 76
diff changeset
   142
}}}
mkobetic
parents: 76
diff changeset
   143
Here the #doing: transform captures the fact that there was in fact an element flowing through the limited: stream and sets the wasEmpty flag accordingly. This way we can detect the first empty limiting: stream and raise Incomplete. Alternatively the block stream can capture the substream in a variable and before creating next one it can check if its position reached the limit.
mkobetic
parents: 76
diff changeset
   144
{{{
mkobetic
parents: 76
diff changeset
   145
        | main current |
mkobetic
parents: 76
diff changeset
   146
        main := (1 to: 10) reading.
mkobetic
parents: 76
diff changeset
   147
        current := nil.
mkobetic
parents: 76
diff changeset
   148
        [       (current notNil and: [ current position < 3 ]) ifTrue: [ Incomplete zero raise ].
mkobetic
parents: 76
diff changeset
   149
                current := main limiting: 3
mkobetic
parents: 76
diff changeset
   150
        ] reading stitching rest
mkobetic
parents: 76
diff changeset
   151
}}}
mkobetic
parents: 76
diff changeset
   152
Following example traverses current directory recursively by continuously adding to a queue of directories to search from and using the stitching to combine them together in to one long stream of filenames.
mkobetic
parents: 76
diff changeset
   153
{{{
mkobetic
parents: 76
diff changeset
   154
        | directories files |
mkobetic
parents: 76
diff changeset
   155
        directories := Xtreams.ElasticBuffer new: 10 class: Array.
mkobetic
parents: 76
diff changeset
   156
        directories put: ''.'' asFilename.
mkobetic
parents: 76
diff changeset
   157
        files :=
mkobetic
parents: 76
diff changeset
   158
                [       directories get reading
mkobetic
parents: 76
diff changeset
   159
                                doing: [:filename | filename isDirectory ifTrue: [directories put: filename]]
mkobetic
parents: 76
diff changeset
   160
                ] reading stitching.
mkobetic
parents: 76
diff changeset
   161
        files rest
mkobetic
parents: 76
diff changeset
   162
}}}
mkobetic
parents: 76
diff changeset
   163
mkobetic
parents: 76
diff changeset
   164
A practical example of stitching write streams is chunking of written content into size-prefixed chunks of some maximum size. This is something that can be often seen in network protocols (e.g. when individual chunks need to be encrypted or signed).
mkobetic
parents: 76
diff changeset
   165
{{{
mkobetic
parents: 76
diff changeset
   166
        | output buffer |
mkobetic
parents: 76
diff changeset
   167
        output := ByteArray new writing.
mkobetic
parents: 76
diff changeset
   168
        buffer := RingBuffer on: (ByteArray new: 5).
mkobetic
parents: 76
diff changeset
   169
        [       (buffer writing limiting: buffer cacheSize)
mkobetic
parents: 76
diff changeset
   170
                        closeBlock: [ output put: buffer readSize; write: buffer ];
mkobetic
parents: 76
diff changeset
   171
                        yourself
mkobetic
parents: 76
diff changeset
   172
        ] reading stitching
mkobetic
parents: 76
diff changeset
   173
                write: (1 to: 22); close.
mkobetic
parents: 76
diff changeset
   174
        output close terminal
mkobetic
parents: 76
diff changeset
   175
}}}
mkobetic
parents: 76
diff changeset
   176
'
mkobetic
parents: 76
diff changeset
   177
!
mkobetic
parents: 76
diff changeset
   178
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   179
!stx_goodies_xtreams_substreams class methodsFor:'documentation'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   180
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   181
extensionsVersion_SVN
86
mkobetic
parents: 76
diff changeset
   182
    ^ '$Id: extensions.st 76 2012-01-30 22:41:10Z mkobetic $'
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   183
! !
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   184
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   185
!stx_goodies_xtreams_substreams class methodsFor:'description'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   186
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   187
excludedFromPreRequisites
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   188
    "list all packages which should be ignored in the automatic
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   189
     preRequisites scan. See #preRequisites for more."
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   190
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   191
    ^ #(
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   192
    )
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   193
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   194
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   195
preRequisites
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   196
    "list all required packages.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   197
     This list can be maintained manually or (better) generated and
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   198
     updated by scanning the superclass hierarchies and looking for
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   199
     global variable accesses. (the browser has a menu function for that)
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   200
     Howevery, often too much is found, and you may want to explicitely
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   201
     exclude individual packages in the #excludedFromPrerequisites method."
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   202
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   203
    ^ #(
75
mkobetic
parents: 67
diff changeset
   204
        #'stx:goodies/xtreams/core'    "Xtreams::WriteStream - superclass of Xtreams::WriteSubstream "
76
mkobetic
parents: 75
diff changeset
   205
        #'stx:goodies/xtreams/support'
75
mkobetic
parents: 67
diff changeset
   206
        #'stx:libbasic'    "Object - superclass of Xtreams::TestReadSubstream "
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   207
    )
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   208
! !
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   209
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   210
!stx_goodies_xtreams_substreams class methodsFor:'description - contents'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   211
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   212
classNamesAndAttributes
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   213
    "lists the classes which are to be included in the project.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   214
     Each entry in the list may be: a single class-name (symbol),
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   215
     or an array-literal consisting of class name and attributes.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   216
     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   217
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   218
    ^ #(
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   219
        "<className> or (<className> attributes...) in load order"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   220
        #'Xtreams::ReadSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   221
        #'Xtreams::StitchReadStream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   222
        #'Xtreams::StitchWriteStream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   223
        #'Xtreams::WriteSubstream'
75
mkobetic
parents: 67
diff changeset
   224
        #'stx_goodies_xtreams_substreams'
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   225
        #'Xtreams::MatchReadSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   226
        #'Xtreams::MatchWriteSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   227
        #'Xtreams::PositionReadSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   228
        #'Xtreams::PositionWriteSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   229
        #'Xtreams::TestReadSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   230
        #'Xtreams::TestWriteSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   231
        #'Xtreams::LimitReadSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   232
        #'Xtreams::LimitWriteSubstream'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   233
    )
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   234
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   235
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   236
extensionMethodNames
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   237
    "lists the extension methods which are to be included in the project.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   238
     Entries are 2-element array literals, consisting of class-name and selector."
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   239
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   240
    ^ #(
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   241
        Block streamingReadMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   242
        Block streamingWriteMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   243
        Object streamingReadMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   244
        Object streamingWriteMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   245
        SequenceableCollection streamingMatchPrefixFunction
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   246
        SequenceableCollection streamingReadMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   247
        SequenceableCollection streamingWriteMatching:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   248
        #'Xtreams::ReadStream' #','
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   249
        #'Xtreams::ReadStream' closing:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   250
        #'Xtreams::ReadStream' ending:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   251
        #'Xtreams::ReadStream' ending:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   252
        #'Xtreams::ReadStream' limiting:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   253
        #'Xtreams::ReadStream' slicing
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   254
        #'Xtreams::ReadStream' stitching
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   255
        #'Xtreams::WriteStream' closing:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   256
        #'Xtreams::WriteStream' ending:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   257
        #'Xtreams::WriteStream' ending:inclusive:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   258
        #'Xtreams::WriteStream' limiting:
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   259
        #'Xtreams::WriteStream' slicing
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   260
        #'Xtreams::WriteStream' stitching
75
mkobetic
parents: 67
diff changeset
   261
        Block cull:
mkobetic
parents: 67
diff changeset
   262
        Block cull:cull:
mkobetic
parents: 67
diff changeset
   263
        SequenceableCollection copyGrownToAtLeast:
mkobetic
parents: 67
diff changeset
   264
        SequenceableCollection recycle
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   265
    )
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   266
! !
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   267
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   268
!stx_goodies_xtreams_substreams class methodsFor:'description - project information'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   269
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   270
applicationIconFileName
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   271
    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   272
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   273
    ^ nil
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   274
    "/ ^ self applicationName
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   275
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   276
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   277
companyName
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   278
    "Return a companyname which will appear in <lib>.rc"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   279
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   280
    ^ 'eXept Software AG'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   281
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   282
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   283
description
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   284
    "Return a description string which will appear in vc.def / bc.def"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   285
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   286
    ^ 'Smalltalk/X Class library'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   287
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   288
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   289
legalCopyright
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   290
    "Return a copyright string which will appear in <lib>.rc"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   291
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   292
    ^ 'Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   293
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   294
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   295
productName
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   296
    "Return a product name which will appear in <lib>.rc"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   297
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   298
    ^ 'Smalltalk/X'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   299
! !
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   300
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   301
!stx_goodies_xtreams_substreams class methodsFor:'description - svn'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   302
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   303
svnRepositoryUrlString
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   304
    "Return a SVN repository URL of myself.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   305
     (Generated since 2011-04-08)
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   306
    "        
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   307
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   308
    ^ '$URL: https://swing.fit.cvut.cz/svn/stx/goodies/xtreams/trunk/substreams/stx_goodies_xtreams_substreams.st $'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   309
!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   310
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   311
svnRevisionNr
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   312
    "Return a SVN revision number of myself.
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   313
     This number is updated after a commit"
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   314
76
mkobetic
parents: 75
diff changeset
   315
    ^ "$SVN-Revision:"'76'"$"
54
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   316
! !
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   317
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   318
!stx_goodies_xtreams_substreams class methodsFor:'documentation'!
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   319
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   320
version_SVN
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   321
    ^ '$Id: stx_goodies_xtreams_substreams.st 14 2011-11-21 06:01:55Z mkobetic $'
f904d4a57005 packaging
mkobetic
parents:
diff changeset
   322
! !