Skip to content

Commit 5fd77e3

Browse files
committed
2 parents 7e1d3a9 + ac20141 commit 5fd77e3

File tree

10 files changed

+36
-86
lines changed

10 files changed

+36
-86
lines changed

core/src/main/java/fj/P.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,10 @@ public H _8() {
233233
};
234234
}
235235

236+
public static <A, B> P2<A, B> lazyProduct(F0<P2<A, B>> f) {
237+
return P.lazy(() -> f.f()._1(), () -> f.f()._2());
238+
}
239+
236240
/**
237241
* A function that puts an element in a product-2.
238242
*
@@ -548,16 +552,7 @@ public static <A> P1<A> lazy(F<Unit, A> f) {
548552
}
549553

550554
public static <A, B> P2<A, B> lazy(F<Unit, A> fa, F<Unit, B> fb) {
551-
return new P2<A, B>() {
552-
@Override
553-
public A _1() {
554-
return fa.f(unit());
555-
}
556-
@Override
557-
public B _2() {
558-
return fb.f(unit());
559-
}
560-
};
555+
return P.lazy(() -> fa.f(unit()), () -> fb.f(unit()));
561556
}
562557

563558
public static <A, B, C> P3<A, B, C> lazy(F<Unit, A> fa, F<Unit, B> fb, F<Unit, C> fc) {

core/src/main/java/fj/P2.java

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,7 @@ public int hashCode() {
4242
* @return A new product-2 with the elements swapped.
4343
*/
4444
public final P2<B, A> swap() {
45-
return new P2<B, A>() {
46-
public B _1() {
47-
return P2.this._2();
48-
}
49-
50-
public A _2() {
51-
return P2.this._1();
52-
}
53-
};
45+
return P.lazy(() -> P2.this._2(), () -> P2.this._1());
5446
}
5547

5648
/**
@@ -60,15 +52,8 @@ public A _2() {
6052
* @return A product with the given function applied.
6153
*/
6254
public final <X> P2<X, B> map1(final F<A, X> f) {
63-
return new P2<X, B>() {
64-
public X _1() {
65-
return f.f(P2.this._1());
66-
}
67-
68-
public B _2() {
69-
return P2.this._2();
70-
}
71-
};
55+
P2<A, B> self = this;
56+
return P.lazy(() -> f.f(self._1()), () -> self._2());
7257
}
7358

7459
/**
@@ -78,15 +63,7 @@ public B _2() {
7863
* @return A product with the given function applied.
7964
*/
8065
public final <X> P2<A, X> map2(final F<B, X> f) {
81-
return new P2<A, X>() {
82-
public A _1() {
83-
return P2.this._1();
84-
}
85-
86-
public X _2() {
87-
return f.f(P2.this._2());
88-
}
89-
};
66+
return P.lazy(() -> P2.this._1(), () -> f.f(P2.this._2()));
9067
}
9168

9269

@@ -112,16 +89,8 @@ public final <C, D> P2<C, D> split(final F<A, C> f, final F<B, D> g) {
11289
* and with the second element intact.
11390
*/
11491
public final <C> P2<C, B> cobind(final F<P2<A, B>, C> k) {
115-
return new P2<C, B>() {
116-
117-
public C _1() {
118-
return k.f(P2.this);
119-
}
120-
121-
public B _2() {
122-
return P2.this._2();
123-
}
124-
};
92+
P2<A, B> self = this;
93+
return P.lazy(() -> k.f(self), () -> self._2());
12594
}
12695

12796
/**

core/src/main/java/fj/Semigroup.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -316,15 +316,7 @@ public static <A> Semigroup<P1<A>> p1Semigroup(final Semigroup<A> sa) {
316316
* @return A semigroup for binary products.
317317
*/
318318
public static <A, B> Semigroup<P2<A, B>> p2Semigroup(final Semigroup<A> sa, final Semigroup<B> sb) {
319-
return semigroup((a1, a2) -> new P2<A, B>() {
320-
public A _1() {
321-
return sa.sum(a1._1(), a2._1());
322-
}
323-
324-
public B _2() {
325-
return sb.sum(a1._2(), a2._2());
326-
}
327-
});
319+
return semigroup((a1, a2) -> P.lazy(() -> sa.sum(a1._1(), a2._1()), () -> sb.sum(a1._2(), a2._2())));
328320
}
329321

330322
/**

core/src/main/java/fj/data/List.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ public final Option<A> find(final F<A, Boolean> f) {
10691069
public final List<A> intersperse(final A a) {
10701070
return isEmpty() || tail().isEmpty() ?
10711071
this :
1072-
cons(head(), cons(a, tail().intersperse(a)));
1072+
cons(head(), tail().bind(a2 -> List.list(a, a2)));
10731073
}
10741074

10751075
/**

core/src/main/java/fj/data/Stream.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,15 +1085,10 @@ public final P2<Stream<A>, Stream<A>> span(final F<A, Boolean> p) {
10851085
return p(this, this);
10861086
else if (p.f(head())) {
10871087
final P1<P2<Stream<A>, Stream<A>>> yszs = P.lazy(() -> tail()._1().span(p));
1088-
return new P2<Stream<A>, Stream<A>>() {
1089-
@Override public Stream<A> _1() {
1090-
return cons(head(), yszs.map(P2.<Stream<A>, Stream<A>>__1()));
1091-
}
1092-
1093-
@Override public Stream<A> _2() {
1094-
return yszs._1()._2();
1095-
}
1096-
};
1088+
return P.lazy(
1089+
() -> cons(head(), yszs.map(P2.<Stream<A>, Stream<A>>__1())),
1090+
() -> yszs._1()._2()
1091+
);
10971092
} else
10981093
return p(Stream.<A>nil(), this);
10991094
}

core/src/main/java/fj/data/Validation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ public <B, C, D> Validation<List<E>, D> accumulate(Validation<E, B> v2, Validati
763763
}
764764
}
765765

766-
public <B, C, D, $E> Validation<List<E>, E> accumulate(Validation<E, B> v2, Validation<E, C> v3, Validation<E, D> v4, F4<T, B, C, D, E> f) {
766+
public <B, C, D, $E> Validation<List<E>, $E> accumulate(Validation<E, B> v2, Validation<E, C> v3, Validation<E, D> v4, F4<T, B, C, D, $E> f) {
767767
List<E> list = fails(list(this, v2, v3, v4));
768768
if (!list.isEmpty()) {
769769
return Validation.fail(list);

core/src/main/java/fj/data/vector/V.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,7 @@ public static <A> V2<A> v(final A a1, final A a2) {
3636
* @return The vector-2.
3737
*/
3838
public static <A> V2<A> v(final F0<A> a1, final F0<A> a2) {
39-
return V2.p(new P2<A, A>() {
40-
public A _1() {
41-
return a1.f();
42-
}
43-
44-
public A _2() {
45-
return a2.f();
46-
}
47-
});
39+
return V2.p(P.lazy(() -> a1.f(), () -> a2.f()));
4840
}
4941

5042
/**

core/src/main/java/fj/data/vector/V3.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,7 @@ private V3(final P1<A> head, final V2<A> tail) {
3232
public static <A> V3<A> p(final P3<A, A, A> p) {
3333
return new V3<A>(
3434
P.lazy(() -> p._1()),
35-
V2.p(new P2<A, A>() {
36-
public A _1() {
37-
return p._2();
38-
}
39-
40-
public A _2() {
41-
return p._3();
42-
}
43-
}
44-
)
35+
V2.p(P.lazy(() -> p._2(), () -> p._3()))
4536
);
4637
}
4738

core/src/test/java/fj/data/ListTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,12 @@ public void partition() {
6464
assertTrue(e.eq(p._2(), List.list(1, 3)));
6565
}
6666

67+
@Test
68+
public void intersperseOverflow() {
69+
// should not overflow
70+
int n = 100000;
71+
List<Integer> list = List.replicate(n, 1).intersperse(2);
72+
String s = list.toString();
73+
}
74+
6775
}

core/src/test/java/fj/data/TreeMapTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,12 @@ public void minKey() {
122122
assertThat(t2.delete(0).minKey(), equalTo(some(1)));
123123
}
124124

125+
@Test
126+
public void emptyHashCode() {
127+
// Hash code of tree map should not throw NullPointerException
128+
// see https://github.com/functionaljava/functionaljava/issues/187
129+
int i = TreeMap.empty(Ord.stringOrd).hashCode();
130+
assertTrue(true);
131+
}
132+
125133
}

0 commit comments

Comments
 (0)