1- import { LinkedListNode , List } from 'standard-data-structures'
2-
3- import { PureMutableList } from '../internals/PureMutableList'
1+ import { DoublyLinkedList , List , Option } from 'standard-data-structures'
42
53import { Await } from './Await'
64import { FIO , NoEnv , UIO } from './FIO'
@@ -14,41 +12,44 @@ export class Queue<A = never> {
1412 * Returns the Queue as an array
1513 */
1614 public get asArray ( ) : UIO < A [ ] > {
17- return this . Q . asArray
15+ return UIO ( ( ) => this . Q . asArray )
1816 }
1917
2018 /**
2119 * Returns the number of elements in the queue
2220 */
2321 public get length ( ) : UIO < number > {
24- return this . Q . length
22+ return UIO ( ( ) => this . Q . length )
2523 }
2624
2725 /**
2826 * Pulls an item from the queue
2927 */
3028 public get take ( ) : UIO < A > {
31- return this . Q . shift . chain ( sz =>
32- sz
33- . map ( FIO . of )
34- . getOrElse (
35- FIO . flatten (
36- Await . of < never , A > ( ) . chain (
37- FIO . encase ( await => this . T . add ( await ) . and ( await . get ) )
38- )
39- )
29+ return FIO . flattenM ( ( ) => {
30+ const sz = this . Q . shift ( )
31+
32+ if ( Option . isSome ( sz ) ) {
33+ return FIO . of ( sz . value )
34+ }
35+
36+ return FIO . flatten (
37+ Await . of < never , A > ( ) . chain (
38+ FIO . encase ( await => {
39+ this. T . add ( await )
40+
41+ return await . get
42+ } )
4043 )
41- )
44+ )
45+ } )
4246 }
4347
4448 /**
4549 * Creates a new bounded Queue
4650 */
4751 public static bounded < A > ( capacity : number ) : UIO < Queue < A > > {
48- return PureMutableList . of < A > ( ) . zipWith (
49- PureMutableList . of < Await < never , A > > ( ) ,
50- ( Q , T ) => new Queue ( capacity , Q , T )
51- )
52+ return UIO ( ( ) => new Queue ( capacity ) )
5253 }
5354
5455 /**
@@ -58,24 +59,40 @@ export class Queue<A = never> {
5859 return Queue . bounded ( Number . MAX_SAFE_INTEGER )
5960 }
6061
61- private constructor (
62- public readonly capacity : number ,
63- private readonly Q : PureMutableList < A > ,
64- private readonly T : PureMutableList < Await < never , A > >
65- ) { }
62+ private readonly Q = DoublyLinkedList . of < A > ( )
63+ private readonly T = DoublyLinkedList . of < Await < never , A > > ( )
64+ private constructor ( public readonly capacity : number ) { }
6665
6766 /**
6867 * Inserts an item into the queue
6968 */
70- public offer ( a : A ) : UIO < LinkedListNode < A > > {
71- return this . Q . add ( a ) . tap ( _ => this . setAwaited ( _ . value ) )
69+ public offer ( a : A ) : UIO < void > {
70+ return FIO . flattenM (
71+ ( ) : UIO < void > => {
72+ if ( this . T . length === 0 ) {
73+ this . Q . add ( a )
74+
75+ return FIO . void ( )
76+ }
77+
78+ const io = new Array < UIO < boolean > > ( )
79+ while ( this . T . length !== 0 ) {
80+ const item = this . T . shift ( )
81+ if ( Option . isSome ( item ) ) {
82+ io . push ( item . value . set ( FIO . of ( a ) ) )
83+ }
84+ }
85+
86+ return FIO . seq ( io ) . void
87+ }
88+ )
7289 }
7390
7491 /**
7592 * Adds all the provided items into the queue
7693 */
77- public offerAll ( ...a : A [ ] ) : UIO < Array < LinkedListNode < A > > > {
78- return FIO . seq ( a . map ( _ => this . offer ( _ ) ) )
94+ public offerAll ( ...a : A [ ] ) : UIO < void > {
95+ return FIO . seq ( a . map ( _ => this . offer ( _ ) ) ) . void
7996 }
8097
8198 /**
@@ -92,19 +109,6 @@ export class Queue<A = never> {
92109 return itar ( 0 , List . empty < A > ( ) ) . map ( _ => _ . asArray )
93110 }
94111
95- private setAwaited ( value : A ) : UIO < boolean [ ] > {
96- const itar = ( list : List < UIO < boolean > > ) : UIO < List < UIO < boolean > > > =>
97- this . T . shift . chain ( _ =>
98- _ . map ( AWT => itar ( list . prepend ( AWT . set ( FIO . of ( value ) ) ) ) ) . getOrElse (
99- FIO . of ( list )
100- )
101- )
102-
103- return itar ( List . empty < UIO < boolean > > ( ) )
104- . tap ( _ => ( ! _ . isEmpty ? this . Q . shift : FIO . void ( ) ) )
105- . chain ( _ => FIO . seq ( _ . asArray ) )
106- }
107-
108112 /**
109113 * Converts a queue into a [[FStream]]
110114 */
0 commit comments