HandlerCollection.st
author claus
Thu, 10 Aug 1995 20:36:43 +0200
changeset 85 df13b436b54e
parent 84 d401ce0001dc
child 112 3e18f2cfe430
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     1
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1994 by Claus Gittinger
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     3
	      All Rights Reserved
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     4
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    11
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    12
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    13
OrderedCollection subclass:#HandlerCollection
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    14
	 instanceVariableNames:''
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    15
	 classVariableNames:''
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    16
	 poolDictionaries:''
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    17
	 category:'Kernel-Exceptions'
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    18
!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    19
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    20
HandlerCollection comment:'
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    21
COPYRIGHT (c) 1994 by Claus Gittinger
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    22
	     All Rights Reserved
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    23
'!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    24
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    25
!HandlerCollection class methodsFor:'documentation'!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    26
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    27
copyright
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    28
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    29
 COPYRIGHT (c) 1994 by Claus Gittinger
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    30
	      All Rights Reserved
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    31
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    32
 This software is furnished under a license and may be used
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    37
 hereby transferred.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    38
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    39
!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    40
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    41
version
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    42
"
85
claus
parents: 84
diff changeset
    43
$Header: /cvs/stx/stx/libbasic2/HandlerCollection.st,v 1.3 1995-08-10 18:35:39 claus Exp $
43
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    44
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    45
!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    46
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    47
documentation
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    48
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    49
    A HandlerCollection allows a group of unrelated signals to be handled
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    50
    by individual handlers - their evaluation is equivalent to a corresponding
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    51
    number of nested signal handlers, but somwehat easier to program.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    52
    In the real world, handlerCollections are seldom needed and actually currently
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    53
    not used by the system.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    54
"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    55
! !
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    56
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    57
!HandlerCollection methodsFor:'save evaluation'!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    58
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    59
handleDo:aBlock
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    60
    "evaluate the argument, aBlock.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    61
     If any of the signals in the receiver is raised during evaluation,
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    62
     evaluate the corresponding handleBlock from the receiver,
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    63
     passing it an Exception argument.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    64
     The handler may decide how to react to the signal by sending
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    65
     a corresponding message to the exception (see there).
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    66
     If none of the signals is raised during evaluation, return the 
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    67
     value returned by aBlock."
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    68
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    69
     ^ self from:1 to:self size handleDo:aBlock
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    70
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    71
    "
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    72
     |h num|
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    73
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    74
     h := HandlerCollection new.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    75
     h on:(Number divisionByZeroSignal)
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    76
       handle:[:ex | 'division by zero' printNL. ex proceed].
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    77
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    78
     h on:(Object haltSignal)
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    79
       handle:[:ex | 'halt encountered ' printNL. ex proceed].
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    80
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    81
     h on:(Float domainErrorSignal)
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    82
       handle:[:ex | 'domain error  ' printNL. ex proceed].
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    83
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    84
     h handleDo:[
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    85
	num := 0.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    86
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    87
	'now dividing' printNL.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    88
	1 // num.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    89
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    90
	'now doing bad arcSin' printNL.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    91
	num := 50.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    92
	num arcSin.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    93
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    94
	'now halting' printNL.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    95
	self halt.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    96
     ]
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    97
    "
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    98
! !
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
    99
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   100
!HandlerCollection methodsFor:'private'!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   101
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   102
from:start to:stop handleDo:aBlock
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   103
    "this method recursively sets up a bunch of nested
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   104
     handlers, and finally evaluates the argument, aBlock"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   105
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   106
    |signalHandlerPair|
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   107
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   108
    stop < start ifTrue:[
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   109
	^ aBlock value
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   110
    ].
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   111
    signalHandlerPair := self at:start.
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   112
    ^ (signalHandlerPair key) 
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   113
	  handle:(signalHandlerPair value)
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   114
	  do:[self from:start+1 to:stop handleDo:aBlock]
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   115
! !
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   116
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   117
!HandlerCollection methodsFor:'adding'!
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   118
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   119
on:aSignal handle:aHandler
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   120
    "add a signal<->handler pair to the receiver collection"
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   121
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   122
    self addFirst:(aSignal -> aHandler)
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   123
! !
5fba1e20bca2 Initial revision
claus
parents:
diff changeset
   124