@@ -37,7 +37,7 @@ class Semaphore {
3737 public waiters = new Set < ( ) => void > ( )
3838 public taken = 0
3939
40- constructor ( readonly permits : number ) { }
40+ constructor ( public permits : number ) { }
4141
4242 get free ( ) {
4343 return this . permits - this . taken
@@ -63,21 +63,35 @@ class Semaphore {
6363 return resume ( core . succeed ( n ) )
6464 } )
6565
66- readonly updateTaken = ( f : ( n : number ) => number ) : Effect . Effect < number > =>
67- core . withFiberRuntime ( ( fiber ) => {
68- this . taken = f ( this . taken )
69- if ( this . waiters . size > 0 ) {
70- fiber . getFiberRef ( currentScheduler ) . scheduleTask ( ( ) => {
71- const iter = this . waiters . values ( )
72- let item = iter . next ( )
73- while ( item . done === false && this . free > 0 ) {
74- item . value ( )
75- item = iter . next ( )
76- }
77- } , fiber . getFiberRef ( core . currentSchedulingPriority ) )
78- }
79- return core . succeed ( this . free )
80- } )
66+ updateTakenUnsafe ( fiber : Fiber . RuntimeFiber < any , any > , f : ( n : number ) => number ) : Effect . Effect < number > {
67+ this . taken = f ( this . taken )
68+ if ( this . waiters . size > 0 ) {
69+ fiber . getFiberRef ( currentScheduler ) . scheduleTask ( ( ) => {
70+ const iter = this . waiters . values ( )
71+ let item = iter . next ( )
72+ while ( item . done === false && this . free > 0 ) {
73+ item . value ( )
74+ item = iter . next ( )
75+ }
76+ } , fiber . getFiberRef ( core . currentSchedulingPriority ) )
77+ }
78+ return core . succeed ( this . free )
79+ }
80+
81+ updateTaken ( f : ( n : number ) => number ) : Effect . Effect < number > {
82+ return core . withFiberRuntime ( ( fiber ) => this . updateTakenUnsafe ( fiber , f ) )
83+ }
84+
85+ readonly resize = ( permits : number ) =>
86+ core . asVoid (
87+ core . withFiberRuntime ( ( fiber ) => {
88+ this . permits = permits
89+ if ( this . free < 0 ) {
90+ return core . void
91+ }
92+ return this . updateTakenUnsafe ( fiber , ( taken ) => taken )
93+ } )
94+ )
8195
8296 readonly release = ( n : number ) : Effect . Effect < number > => this . updateTaken ( ( taken ) => taken - n )
8397
@@ -104,7 +118,7 @@ class Semaphore {
104118}
105119
106120/** @internal */
107- export const unsafeMakeSemaphore = ( permits : number ) : Semaphore => new Semaphore ( permits )
121+ export const unsafeMakeSemaphore = ( permits : number ) : Effect . Semaphore => new Semaphore ( permits )
108122
109123/** @internal */
110124export const makeSemaphore = ( permits : number ) => core . sync ( ( ) => unsafeMakeSemaphore ( permits ) )
0 commit comments