@@ -13,13 +13,13 @@ import japgolly.scalajs.react._
13
13
*
14
14
* @since 0.9.0
15
15
*/
16
- sealed abstract class ReusableFn [A , B ] extends AbstractFunction1 [A , B ] {
17
- private [extra] def reusable : PartialFunction [ ReusableFn [ A , B ] , Boolean ]
16
+ sealed abstract class ReusableFn [- A , + B ] extends AbstractFunction1 [A , B ] {
17
+ private [extra] def reusable [ AA <: A , BB >: B ] : PartialFunction [ AA ~=> BB , Boolean ]
18
18
19
- def asVar (value : A )(implicit r : Reusability [A ], ev : ReusableFn [ A , B ] =:= ReusableFn [ A , Callback ]) : ReusableVar [A ] =
19
+ def asVar [ AA <: A ] (value : AA )(implicit r : Reusability [AA ], ev : ( A ~=> B ) <:< ( AA ~=> Callback )) : ReusableVar [AA ] =
20
20
new ReusableVar (value, ev(this ))(r)
21
21
22
- def asVarR (value : A , r : Reusability [A ])(implicit ev : ReusableFn [ A , B ] =:= ReusableFn [ A , Callback ]) : ReusableVar [A ] =
22
+ def asVarR [ AA <: A ] (value : AA , r : Reusability [AA ])(implicit ev : ( A ~=> B ) <:< ( AA ~=> Callback )) : ReusableVar [AA ] =
23
23
asVar(value)(r, ev)
24
24
25
25
def dimap [C , D ](f : (A => B ) => C => D ): C ~=> D =
@@ -31,7 +31,7 @@ sealed abstract class ReusableFn[A, B] extends AbstractFunction1[A, B] {
31
31
def contramap [C ](f : C => A ): C ~=> B =
32
32
dimap(f.andThen)
33
33
34
- def fnA (a : A )(implicit ra : Reusability [A ]): ReusableFnA [A , B ] =
34
+ def fnA [ AA <: A , BB >: B ] (a : AA )(implicit ra : Reusability [AA ]): ReusableFnA [AA , BB ] =
35
35
new ReusableFnA (a, this )
36
36
}
37
37
@@ -98,74 +98,74 @@ object ReusableFn {
98
98
// ===================================================================================================================
99
99
private type R [A ] = Reusability [A ]
100
100
101
- private class Fn1 [Y , Z ](val f : Y => Z ) extends ReusableFn [Y , Z ] {
101
+ private class Fn1 [- Y , + Z ](val f : Y => Z ) extends ReusableFn [Y , Z ] {
102
102
override def apply (a : Y ) = f(a)
103
- override private [extra] def reusable = { case x : Fn1 [Y , Z ] => f eq x.f }
103
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Fn1 [I , O ] => f eq x.f }
104
104
}
105
105
106
- private class Fn2 [A : R , Y , Z ](val f : (A , Y ) => Z ) extends ReusableFn [A , Y ~=> Z ] {
106
+ private class Fn2 [A : R , - Y , + Z ](val f : (A , Y ) => Z ) extends ReusableFn [A , Y ~=> Z ] {
107
107
override def apply (a : A ) = new Cur1 (a, f)
108
- override private [extra] def reusable = { case x : Fn2 [A , Y , Z ] => f eq x.f }
108
+ override private [extra] def reusable [ I <: A , O >: ( Y ~=> Z )] = { case x : Fn2 [I , _, _ ] => f eq x.f }
109
109
}
110
110
111
- private class Fn3 [A : R , B : R , Y , Z ](val f : (A , B , Y ) => Z ) extends ReusableFn [A , B ~=> (Y ~=> Z )] {
111
+ private class Fn3 [A : R , B : R , - Y , + Z ](val f : (A , B , Y ) => Z ) extends ReusableFn [A , B ~=> (Y ~=> Z )] {
112
112
private val c2 = cur2(f)
113
113
override def apply (a : A ) = new Cur1 (a, c2)
114
- override private [extra] def reusable = { case x : Fn3 [A , B , Y , Z ] => f eq x.f }
114
+ override private [extra] def reusable [ I <: A , O >: ( B ~=> ( Y ~=> Z ))] = { case x : Fn3 [I , _, _, _ ] => f eq x.f }
115
115
}
116
116
117
- private class Fn4 [A : R , B : R , C : R , Y , Z ](val f : (A , B , C , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (Y ~=> Z ))] {
117
+ private class Fn4 [A : R , B : R , C : R , - Y , + Z ](val f : (A , B , C , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (Y ~=> Z ))] {
118
118
private val c3 = cur3(f)
119
119
private val c2 = cur2(c3)
120
120
override def apply (a : A ) = new Cur1 (a, c2)
121
- override private [extra] def reusable = { case x : Fn4 [A , B , C , Y , Z ] => f eq x.f }
121
+ override private [extra] def reusable [ I <: A , O >: ( B ~=> ( C ~=> ( Y ~=> Z )))] = { case x : Fn4 [I , _, _, _, _ ] => f eq x.f }
122
122
}
123
123
124
- private class Fn5 [A : R , B : R , C : R , D : R , Y , Z ](val f : (A , B , C , D , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (D ~=> (Y ~=> Z )))] {
124
+ private class Fn5 [A : R , B : R , C : R , D : R , - Y , + Z ](val f : (A , B , C , D , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (D ~=> (Y ~=> Z )))] {
125
125
private val c4 = cur4(f)
126
126
private val c3 = cur3(c4)
127
127
private val c2 = cur2(c3)
128
128
override def apply (a : A ) = new Cur1 (a, c2)
129
- override private [extra] def reusable = { case x : Fn5 [A , B , C , D , Y , Z ] => f eq x.f }
129
+ override private [extra] def reusable [ I <: A , O >: ( B ~=> ( C ~=> ( D ~=> ( Y ~=> Z ))))] = { case x : Fn5 [I , _, _, _, _, _ ] => f eq x.f }
130
130
}
131
131
132
- private class Fn6 [A : R , B : R , C : R , D : R , E : R , Y , Z ](val f : (A , B , C , D , E , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (D ~=> (E ~=> (Y ~=> Z ))))] {
132
+ private class Fn6 [A : R , B : R , C : R , D : R , E : R , - Y , + Z ](val f : (A , B , C , D , E , Y ) => Z ) extends ReusableFn [A , B ~=> (C ~=> (D ~=> (E ~=> (Y ~=> Z ))))] {
133
133
private val c5 = cur5(f)
134
134
private val c4 = cur4(c5)
135
135
private val c3 = cur3(c4)
136
136
private val c2 = cur2(c3)
137
137
override def apply (a : A ) = new Cur1 (a, c2)
138
- override private [extra] def reusable = { case x : Fn6 [A , B , C , D , E , Y , Z ] => f eq x.f }
138
+ override private [extra] def reusable [ I <: A , O >: ( B ~=> ( C ~=> ( D ~=> ( E ~=> ( Y ~=> Z )))))] = { case x : Fn6 [I , _, _, _, _, _, _ ] => f eq x.f }
139
139
}
140
140
141
141
@ inline private def cur2 [A : R , B : R , Y , Z ](f : (A ,B , Y ) => Z ): (A ,B ) => (Y ~=> Z ) = new Cur2 (_,_, f)
142
142
@ inline private def cur3 [A : R , B : R , C : R , Y , Z ](f : (A ,B ,C , Y ) => Z ): (A ,B ,C ) => (Y ~=> Z ) = new Cur3 (_,_,_, f)
143
143
@ inline private def cur4 [A : R , B : R , C : R , D : R , Y , Z ](f : (A ,B ,C ,D , Y ) => Z ): (A ,B ,C ,D ) => (Y ~=> Z ) = new Cur4 (_,_,_,_, f)
144
144
@ inline private def cur5 [A : R , B : R , C : R , D : R , E : R , Y , Z ](f : (A ,B ,C ,D ,E ,Y ) => Z ): (A ,B ,C ,D ,E ) => (Y ~=> Z ) = new Cur5 (_,_,_,_,_,f)
145
145
146
- private class Cur1 [A : R , Y , Z ](val a : A , val f : (A , Y ) => Z ) extends ReusableFn [Y , Z ] {
146
+ private class Cur1 [A : R , - Y , + Z ](val a : A , val f : (A , Y ) => Z ) extends ReusableFn [Y , Z ] {
147
147
override def apply (y : Y ): Z = f(a, y)
148
- override private [extra] def reusable = { case x : Cur1 [A , Y , Z ] => (f eq x.f) && (a ~=~ x.a) }
148
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Cur1 [A , _, _ ] => (f eq x.f) && (a ~=~ x.a) }
149
149
}
150
150
151
- private class Cur2 [A : R , B : R , Y , Z ](val a : A , val b : B , val f : (A , B , Y ) => Z ) extends ReusableFn [Y , Z ] {
151
+ private class Cur2 [A : R , B : R , - Y , + Z ](val a : A , val b : B , val f : (A , B , Y ) => Z ) extends ReusableFn [Y , Z ] {
152
152
override def apply (y : Y ): Z = f(a, b, y)
153
- override private [extra] def reusable = { case x : Cur2 [A , B , Y , Z ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) }
153
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Cur2 [A , B , _, _ ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) }
154
154
}
155
155
156
- private class Cur3 [A : R , B : R , C : R , Y , Z ](val a : A , val b : B , val c : C , val f : (A , B , C , Y ) => Z ) extends ReusableFn [Y , Z ] {
156
+ private class Cur3 [A : R , B : R , C : R , - Y , + Z ](val a : A , val b : B , val c : C , val f : (A , B , C , Y ) => Z ) extends ReusableFn [Y , Z ] {
157
157
override def apply (y : Y ): Z = f(a, b, c, y)
158
- override private [extra] def reusable = { case x : Cur3 [A , B , C , Y , Z ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) }
158
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Cur3 [A , B , C , _, _ ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) }
159
159
}
160
160
161
- private class Cur4 [A : R , B : R , C : R , D : R , Y , Z ](val a : A , val b : B , val c : C , val d : D , val f : (A , B , C , D , Y ) => Z ) extends ReusableFn [Y , Z ] {
161
+ private class Cur4 [A : R , B : R , C : R , D : R , - Y , + Z ](val a : A , val b : B , val c : C , val d : D , val f : (A , B , C , D , Y ) => Z ) extends ReusableFn [Y , Z ] {
162
162
override def apply (y : Y ): Z = f(a, b, c, d, y)
163
- override private [extra] def reusable = { case x : Cur4 [A , B , C , D , Y , Z ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) && (d ~=~ x.d) }
163
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Cur4 [A , B , C , D , _, _ ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) && (d ~=~ x.d) }
164
164
}
165
165
166
- private class Cur5 [A : R , B : R , C : R , D : R , E : R , Y , Z ](val a : A , val b : B , val c : C , val d : D , val e : E , val f : (A , B , C , D , E , Y ) => Z ) extends ReusableFn [Y , Z ] {
166
+ private class Cur5 [A : R , B : R , C : R , D : R , E : R , - Y , + Z ](val a : A , val b : B , val c : C , val d : D , val e : E , val f : (A , B , C , D , E , Y ) => Z ) extends ReusableFn [Y , Z ] {
167
167
override def apply (y : Y ): Z = f(a, b, c, d, e, y)
168
- override private [extra] def reusable = { case x : Cur5 [A , B , C , D , E , Y , Z ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) && (d ~=~ x.d) && (e ~=~ x.e) }
168
+ override private [extra] def reusable [ I <: Y , O >: Z ] = { case x : Cur5 [A , B , C , D , E , _, _ ] => (f eq x.f) && (a ~=~ x.a) && (b ~=~ x.b) && (c ~=~ x.c) && (d ~=~ x.d) && (e ~=~ x.e) }
169
169
}
170
170
}
171
171
0 commit comments