terminals/Xtreams__BlockClosureGenerateStream.st
author mkobetic
Sun, 15 Jan 2012 22:27:17 +0000
changeset 43 b9a077d6ce14
parent 39 80fdc4602b14
child 52 a1363827b596
permissions -rw-r--r--
pipes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43
mkobetic
parents: 39
diff changeset
     1
'From Smalltalk/X, Version:6.2.1 on 15-01-2012 at 05:26:18 PM'                  !
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
     2
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ Package: 'stx:goodies/xtreams/terminals' }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
"{ NameSpace: Xtreams }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
ReadStream subclass:#BlockClosureGenerateStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	instanceVariableNames:'process current contentsSpecies writing readingSemaphore
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     9
		writingSemaphore closed'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
	classVariableNames:''
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
	poolDictionaries:''
25
02e7c3b6f63c added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 9
diff changeset
    12
	category:'Xtreams-Terminals'
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
BlockClosureGenerateStream comment:'Read stream on a one argument block, evaluates the block once for the life time of the stream. Once the block finishes execution, the stream is closed. The block is expected to write to the block argument, which will block exectuion until elements are read from the stream.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	"In this example, we have a -hard- loop, not using collection protocol, which will only run one element at a time."
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
	[:out | 1 to: 10 do: [:i | out put: i]] reading read: 5.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
	"Fibonacci"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
	[:out | | a b x |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
	a := 0. b := 1.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
	[out put: a.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	x := a.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	a := b.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
	b := b + x] repeat] reading ++ 500; get.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
Instance Variables
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
	current	<Object>	the current element in the stream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	closed	<Boolean>	true if the block has finished execution
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
	contentsSpecies	<Class>	species for collections of elements of this stream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
	process	<Process>	the process executing the block
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
	readingSemaphore	<Semaphore>	attempts to read will wait on this
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	writingSemaphore	<Semaphore>	attempts to write will wait on this, signaled when an attempt to read is performed
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
!BlockClosureGenerateStream methodsFor:'accessing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
get
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
	writingSemaphore signal.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
	closed ifTrue: [Incomplete zero raise].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	readingSemaphore wait.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
	^current
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
read: anInteger into: aSequenceableCollection at: startIndex
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
	| count |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
	count := 0.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
	[[count < anInteger] whileTrue:
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
		[aSequenceableCollection at: startIndex + count put: self get.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
		count := count + 1]]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
			on: Incomplete do: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
	^anInteger
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
!BlockClosureGenerateStream methodsFor:'initialize-release'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
close
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
	closed := true.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
	process terminate.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
	readingSemaphore signal
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
contentsSpecies
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
	^contentsSpecies
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
contentsSpecies: aClass
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
	contentsSpecies := aClass
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
on: aBlockClosure
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
	super on: aBlockClosure.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
	contentsSpecies := Array.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
	readingSemaphore := Semaphore new.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
	writingSemaphore := Semaphore new.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
	closed := false.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
	process :=
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
		[aBlockClosure value: [:in |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
			writingSemaphore wait.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
			current := in.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
			readingSemaphore signal] writing.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
		closed := true] fork
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
!BlockClosureGenerateStream class methodsFor:'documentation'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
version_SVN
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
    ^ '$Id$'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
! !