Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions core/src/main/java/fj/Equal.java
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,11 @@ public static <A> Equal<V8<A>> v8Equal(final Equal<A> ea) {
return streamEqual(ea).contramap(V8.toStream_());
}

/**
* An equal instance for the <code>Natural</code> type.
*/
public static Equal<Natural> naturalEqual = Equal.equal(l -> r -> bigintEqual.eq(l.bigIntegerValue(), r.bigIntegerValue()));

/**
* An equal instance for lazy strings.
*/
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/java/fj/Hash.java
Original file line number Diff line number Diff line change
Expand Up @@ -535,4 +535,9 @@ public static <A> Hash<V7<A>> v7Hash(final Hash<A> ea) {
public static <A> Hash<V8<A>> v8Hash(final Hash<A> ea) {
return streamHash(ea).contramap(V8.toStream_());
}

/**
* A hash instance for the {@link Natural} type.
*/
public static Hash<Natural> naturalHash = Hash.hash(n -> bigintHash.hash(n.bigIntegerValue()));
}
2 changes: 1 addition & 1 deletion core/src/main/java/fj/Semigroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
semigroup(Natural::multiply);

/**
* A semigroup that multiplies natural numbers.
* A semigroup that adds natural numbers.
*/
public static final Semigroup<Natural> naturalAdditionSemigroup =
semigroup(Natural::add);
Expand Down
23 changes: 22 additions & 1 deletion core/src/main/java/fj/data/Natural.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package fj.data;

import static fj.Bottom.error;

import fj.Equal;
import fj.F;

import static fj.Monoid.naturalAdditionMonoid;
import static fj.Monoid.naturalMultiplicationMonoid;
import static fj.Function.curry;

import fj.Hash;
import fj.Show;
import fj.data.vector.V2;
import fj.data.vector.V;

Expand Down Expand Up @@ -121,7 +126,7 @@ public Natural add(final Natural n) {
* @return The difference between the two numbers, if this number is larger than the given one. Otherwise none.
*/
public Option<Natural> subtract(final Natural n) {
return natural(n.value.subtract(value));
return natural(value.subtract(n.value));
}

/**
Expand Down Expand Up @@ -286,4 +291,20 @@ public static Natural sum(final List<Natural> ns) {
public static Natural product(final List<Natural> ns) {
return naturalMultiplicationMonoid.sumLeft(ns);
}


@Override
public int hashCode() {
return Hash.naturalHash.hash(this);
}

@Override
public boolean equals(final Object that) {
return Equal.equals0(Natural.class, this, that, Equal.naturalEqual);
}

@Override
public String toString() {
return Show.naturalShow.showS(this);
}
}
11 changes: 10 additions & 1 deletion quickcheck/src/main/java/fj/test/Arbitrary.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fj.test;

import fj.Equal;
import fj.F;
import fj.F2;
import fj.F3;
Expand Down Expand Up @@ -38,6 +39,7 @@
import fj.data.Set;
import fj.data.TreeMap;
import fj.function.Effect1;
import fj.function.Longs;

import static fj.data.Stream.range;
import static fj.test.Gen.choose;
Expand Down Expand Up @@ -760,7 +762,7 @@ public static <A> Gen<ArrayList<A>> arbArrayList(final Gen<A> aa) {
/**
* Returns an arbitrary implementation for a Java enumeration.
*
* @param clazz The type of enum to return an arbtrary of.
* @param clazz The type of enum to return an arbitrary of.
* @return An arbitrary for instances of the supplied enum type.
*/
public static <A extends Enum<A>> Gen<A> arbEnumValue(final Class<A> clazz) {
Expand Down Expand Up @@ -1337,4 +1339,11 @@ public static <A, B, C, D, E> Gen<P5<A, B, C, D, E>> arbP5(final Gen<A> aa, fina
return aa.bind(ab, ac, ad, ae, af, ag, ah,
a -> b -> c -> d -> e -> f -> g -> h -> p(a, b, c, d, e, f, g, h));
}

/**
* An arbitrary implementation for naturals.
*/
public static Gen<Natural> arbNatural = arbLong.filter(l -> Equal.longEqual.notEq(l, Long.MIN_VALUE))
.map(Longs.abs).map(Natural::natural).map(o -> o.some());

}
7 changes: 7 additions & 0 deletions quickcheck/src/main/java/fj/test/Shrink.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import fj.data.Either;
import fj.data.Java;
import fj.data.List;
import fj.data.Natural;
import fj.data.Option;
import fj.data.Stream;

Expand Down Expand Up @@ -846,4 +847,10 @@ public static <A, B, C, D, E> Shrink<P5<A, B, C, D, E>> shrinkP5(final Shrink<A>
sg.shrink(p._7()), sh.shrink(p._8()), p8);
});
}

/**
* A shrink strategy for naturals.
*/
public static Shrink<Natural> shrinkNatural = shrinkLong.map(bi -> Natural.natural(bi).orSome(Natural.ZERO), Natural::longValue);

}