1212import java .lang .ref .WeakReference ;
1313
1414import static fj .P .p ;
15+ import static fj .Unit .unit ;
1516//import fj.data.*;
1617
1718
@@ -240,6 +241,10 @@ public final <B> P1<B> map(final F<A, B> f) {
240241 return P .lazy (() -> f .f (self ._1 ()));
241242 }
242243
244+ /**
245+ * @deprecated since 4.7. Use {@link P1#weakMemo()} instead.
246+ */
247+ @ Deprecated
243248 public final P1 <A > memo () {
244249 return weakMemo ();
245250 }
@@ -261,29 +266,37 @@ public final P1<A> memo() {
261266 */
262267 public P1 <A > softMemo () { return new SoftReferenceMemo <>(this ); }
263268
269+ /**
270+ * @deprecated since 4.7. Use {@link P#weakMemo(F0)} instead.
271+ */
272+ @ Deprecated
264273 public static <A > P1 <A > memo (F <Unit , A > f ) {
265- return P .lazy ( f ). weakMemo ( );
274+ return P .weakMemo (() -> f . f ( unit ()) );
266275 }
267276
268- public static <A > P1 <A > memo (F0 <A > f ) {
269- return P .lazy (f ).weakMemo ();
277+ /**
278+ * @deprecated since 4.7. Use {@link P#weakMemo(F0)} instead.
279+ */
280+ @ Deprecated
281+ public static <A > P1 <A > memo (F0 <A > f ) {
282+ return P .weakMemo (f );
270283 }
271284
272285 static final class Memo <A > extends P1 <A > {
273- private volatile P1 <A > self ;
286+ private volatile F0 <A > fa ;
274287 private A value ;
275288
276- Memo (P1 <A > self ) { this .self = self ; }
289+ Memo (F0 <A > fa ) { this .fa = fa ; }
277290
278291 @ Override public final A _1 () {
279- return (self == null ) ? value : computeValue ();
292+ return (fa == null ) ? value : computeValue ();
280293 }
281294
282295 private synchronized A computeValue () {
283- P1 <A > self = this .self ;
284- if (self != null ) {
285- value = self . _1 ();
286- this .self = null ;
296+ F0 <A > fa = this .fa ;
297+ if (fa != null ) {
298+ value = fa . f ();
299+ this .fa = null ;
287300 }
288301 return value ;
289302 }
@@ -294,10 +307,10 @@ private synchronized A computeValue() {
294307 }
295308
296309 abstract static class ReferenceMemo <A > extends P1 <A > {
297- private final P1 <A > self ;
310+ private final F0 <A > fa ;
298311 private volatile Reference <P1 <A >> v = null ;
299312
300- ReferenceMemo (final P1 <A > self ) { this .self = self ; }
313+ ReferenceMemo (final F0 <A > fa ) { this .fa = fa ; }
301314
302315 @ Override public final A _1 () {
303316 Reference <P1 <A >> v = this .v ;
@@ -309,7 +322,7 @@ private synchronized A computeValue() {
309322 Reference <P1 <A >> v = this .v ;
310323 P1 <A > p1 = v != null ? v .get () : null ;
311324 if (p1 == null ) {
312- A a = self . _1 ();
325+ A a = fa . f ();
313326 this .v = newReference (p (a ));
314327 return a ;
315328 }
@@ -320,14 +333,14 @@ private synchronized A computeValue() {
320333 }
321334
322335 static final class WeakReferenceMemo <A > extends ReferenceMemo <A > {
323- WeakReferenceMemo (P1 <A > self ) { super (self ); }
336+ WeakReferenceMemo (F0 <A > fa ) { super (fa ); }
324337 @ Override
325338 <B > Reference <B > newReference (final B ref ) { return new WeakReference <>(ref ); }
326339 @ Override public P1 <A > weakMemo () { return this ; }
327340 }
328341
329342 static final class SoftReferenceMemo <A > extends ReferenceMemo <A > {
330- SoftReferenceMemo (P1 <A > self ) { super (self ); }
343+ SoftReferenceMemo (F0 <A > self ) { super (self ); }
331344 @ Override
332345 <B > Reference <B > newReference (final B ref ) { return new SoftReference <>(ref ); }
333346 @ Override public P1 <A > softMemo () { return this ; }
0 commit comments