@@ -5,15 +5,13 @@ const Null: Cons = {
5
5
get next ( ) {
6
6
return this
7
7
} ,
8
- get values ( ) {
9
- return [ ]
10
- } ,
11
8
12
9
get ( ) {
13
10
return this . value
14
11
} ,
15
12
16
13
push ( item ) : Cons {
14
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
17
15
return new Cons ( item , this )
18
16
} ,
19
17
length ( ) {
@@ -25,16 +23,22 @@ const Null: Cons = {
25
23
concat ( ) : Cons {
26
24
return this
27
25
} ,
28
- forEach ( ) {
26
+ forEach ( ) : void {
29
27
/* done */
30
28
} ,
31
- foldl ( _ , initial ) : any {
32
- return initial
29
+ foldl < TValue = unknown , TReturn = unknown > (
30
+ _ : ( initial : TReturn , value : TValue ) => TReturn ,
31
+ initial ?: TReturn
32
+ ) : TReturn {
33
+ return initial as TReturn
33
34
} ,
34
- foldr ( _ , initial ) {
35
- return initial
35
+ foldr < TValue = unknown , TReturn = unknown > (
36
+ _ : ( initial : TReturn , value : TValue ) => TReturn ,
37
+ initial ?: TReturn
38
+ ) : TReturn {
39
+ return initial as TReturn
36
40
} ,
37
- filter ( ) {
41
+ filter ( ) : Cons {
38
42
return Null
39
43
} ,
40
44
reverse ( ) : Cons {
@@ -44,79 +48,101 @@ const Null: Cons = {
44
48
return this
45
49
} ,
46
50
}
47
-
48
51
class Cons {
49
- static fromArray ( [ head , ...tail ] : any [ ] ) {
50
- if ( head === undefined ) {
51
- return Null
52
- }
53
-
54
- return new Cons ( head , Cons . fromArray ( tail || [ ] ) )
55
- }
56
-
57
- constructor ( public readonly value : any , public next : Cons = Null ) { }
58
-
59
- get values ( ) {
60
- return [ this . value , ...this . next . values ]
61
- }
52
+ constructor ( public readonly value : unknown , public next : Cons = Null ) { }
62
53
63
- get ( i : number ) {
54
+ public get ( i : number ) : unknown {
64
55
return i === 0 ? this . value : this . next . get ( i - 1 )
65
56
}
66
57
67
- push ( item : any ) : this {
58
+ public push ( item : unknown ) : this {
68
59
this . next = this . next . push ( item )
69
60
return this
70
61
}
71
62
72
- length ( ) : number {
63
+ public length ( ) : number {
73
64
return 1 + this . next . length ( )
74
65
}
75
66
76
- append ( other : Cons ) : Cons {
67
+ public append ( other : Cons ) : Cons {
77
68
return other . foldl ( ( result , item ) => result . push ( item ) , this )
78
69
}
79
70
80
- concat ( others : Cons ) : Cons {
81
- return others . foldl ( ( result , other ) => result . append ( other ) , this )
71
+ public concat ( others : Cons ) : Cons {
72
+ return others . foldl < Cons , Cons > (
73
+ ( result , other ) => result . append ( other ) ,
74
+ this
75
+ )
82
76
}
83
77
84
- foldl (
85
- callback : ( initial : any , value : any ) => any ,
86
- initial : any = undefined
87
- ) : any {
88
- return this . next . foldl ( callback , callback ( initial , this . value ) )
78
+ public foldl < TValue = unknown > (
79
+ callback : ( initial : TValue , value : TValue ) => TValue
80
+ ) : TValue
81
+ public foldl < TValue = unknown , TReturn = unknown > (
82
+ callback : ( initial : TReturn , value : TValue ) => TReturn ,
83
+ initial : TReturn
84
+ ) : TReturn
85
+
86
+ public foldl < TValue = unknown , TReturn = unknown > (
87
+ callback : ( initial : TReturn | undefined , value : TValue ) => TReturn ,
88
+ initial ?: TReturn
89
+ ) : TReturn {
90
+ return this . next . foldl < TValue , TReturn > (
91
+ callback ,
92
+ callback ( initial , this . value as TValue )
93
+ )
89
94
}
90
95
91
- forEach ( callback : ( value : any ) => void ) : void {
96
+ public forEach ( callback : ( value : unknown ) => void ) : void {
92
97
this . foldl ( ( _ , item ) => callback ( item ) )
93
98
}
94
99
95
- foldr (
96
- callback : ( initial : any , value : any ) => any ,
97
- initial : any = undefined
98
- ) : any {
99
- return callback ( this . next . foldr ( callback , initial ) , this . value )
100
+ public foldr < TValue = unknown > (
101
+ callback : ( initial : TValue , value : TValue ) => TValue
102
+ ) : TValue
103
+ public foldr < TValue = unknown , TReturn = unknown > (
104
+ callback : ( initial : TReturn , value : TValue ) => TReturn ,
105
+ initial : TReturn
106
+ ) : TReturn
107
+
108
+ public foldr < TValue = unknown , TReturn = unknown > (
109
+ callback : ( initial : TReturn , value : TValue ) => TReturn ,
110
+ initial ?: TReturn
111
+ ) : TReturn {
112
+ return callback (
113
+ this . next . foldr < TValue , TReturn > ( callback , initial as TReturn ) ,
114
+ this . value as TValue
115
+ )
100
116
}
101
117
102
- filter ( predicate : ( value : any ) => boolean ) : Cons {
103
- return this . foldl (
118
+ public filter < TValue = unknown > ( predicate : ( value : TValue ) => boolean ) : Cons {
119
+ return this . foldl < TValue , Cons > (
104
120
( result , item ) => ( predicate ( item ) && result . push ( item ) ) || result ,
105
121
Null
106
122
)
107
123
}
108
124
109
- map ( expression : ( value : any ) => any ) : Cons {
110
- return this . foldl ( ( result , item ) => result . push ( expression ( item ) ) , Null )
125
+ public map < TValue = unknown , TReturn = unknown > (
126
+ expression : ( value : TValue ) => TReturn
127
+ ) : Cons {
128
+ return this . foldl < TValue , Cons > (
129
+ ( result , item ) => result . push ( expression ( item ) ) ,
130
+ Null
131
+ )
111
132
}
112
133
113
- reverse ( ) : Cons {
134
+ public reverse ( ) : Cons {
114
135
return this . next . reverse ( ) . push ( this . value )
115
136
}
116
137
}
117
-
118
138
export class List {
119
- constructor ( values = [ ] ) {
120
- return Cons . fromArray ( values )
139
+ public static create ( ...values : unknown [ ] ) : Cons {
140
+ const [ head , ...tail ] = values
141
+
142
+ if ( head === undefined ) {
143
+ return Null
144
+ }
145
+
146
+ return new Cons ( head , List . create ( ...tail ) )
121
147
}
122
148
}
0 commit comments