3939import static fj .data .Stream .nil ;
4040
4141import static java .lang .System .arraycopy ;
42+ import static java .math .BigInteger .ZERO ;
43+
4244import java .math .BigDecimal ;
4345import java .math .BigInteger ;
4446import java .sql .Time ;
@@ -354,7 +356,7 @@ public static <A> Shrink<ArrayList<A>> shrinkArrayList(final Shrink<A> sa) {
354356 * A shrink strategy for enum maps.
355357 *
356358 * @param sk The shrink strategy for keys.
357- * @param sv The shrink stratgey for values.
359+ * @param sv The shrink strategy for values.
358360 * @return A shrink strategy for enum maps.
359361 */
360362 public static <K extends Enum <K >, V > Shrink <EnumMap <K , V >> shrinkEnumMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -385,7 +387,7 @@ public static <A extends Enum<A>> Shrink<EnumSet<A>> shrinkEnumSet(final Shrink<
385387 * A shrink strategy for hash maps.
386388 *
387389 * @param sk The shrink strategy for keys.
388- * @param sv The shrink stratgey for values.
390+ * @param sv The shrink strategy for values.
389391 * @return A shrink strategy for hash maps.
390392 */
391393 public static <K , V > Shrink <HashMap <K , V >> shrinkHashMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -406,7 +408,7 @@ public static <A> Shrink<HashSet<A>> shrinkHashSet(final Shrink<A> sa) {
406408 * A shrink strategy for hash tables.
407409 *
408410 * @param sk The shrink strategy for keys.
409- * @param sv The shrink stratgey for values.
411+ * @param sv The shrink strategy for values.
410412 * @return A shrink strategy for hash tables.
411413 */
412414 @ SuppressWarnings ("UseOfObsoleteCollectionType" )
@@ -430,7 +432,7 @@ public static <K, V> Shrink<Hashtable<K, V>> shrinkHashtable(final Shrink<K> sk,
430432 * A shrink strategy for identity hash maps.
431433 *
432434 * @param sk The shrink strategy for keys.
433- * @param sv The shrink stratgey for values.
435+ * @param sv The shrink strategy for values.
434436 * @return A shrink strategy for identity hash maps.
435437 */
436438 public static <K , V > Shrink <IdentityHashMap <K , V >> shrinkIdentityHashMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -441,7 +443,7 @@ public static <K, V> Shrink<IdentityHashMap<K, V>> shrinkIdentityHashMap(final S
441443 * A shrink strategy for linked hash maps.
442444 *
443445 * @param sk The shrink strategy for keys.
444- * @param sv The shrink stratgey for values.
446+ * @param sv The shrink strategy for values.
445447 * @return A shrink strategy for linked hash maps.
446448 */
447449 public static <K , V > Shrink <LinkedHashMap <K , V >> shrinkLinkedHashMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -514,7 +516,7 @@ public static <A> Shrink<Stack<A>> shrinkStack(final Shrink<A> sa) {
514516 * A shrink strategy for tree maps.
515517 *
516518 * @param sk The shrink strategy for keys.
517- * @param sv The shrink stratgey for values.
519+ * @param sv The shrink strategy for values.
518520 * @return A shrink strategy for tree maps.
519521 */
520522 public static <K , V > Shrink <TreeMap <K , V >> shrinkTreeMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -545,7 +547,7 @@ public static <A> Shrink<Vector<A>> shrinkVector(final Shrink<A> sa) {
545547 * A shrink strategy for weak hash maps.
546548 *
547549 * @param sk The shrink strategy for keys.
548- * @param sv The shrink stratgey for values.
550+ * @param sv The shrink strategy for values.
549551 * @return A shrink strategy for weak hash maps.
550552 */
551553 public static <K , V > Shrink <WeakHashMap <K , V >> shrinkWeakHashMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -570,7 +572,7 @@ public static <A> Shrink<ArrayBlockingQueue<A>> shrinkArrayBlockingQueue(final S
570572 * A shrink strategy for concurrent hash maps.
571573 *
572574 * @param sk The shrink strategy for keys.
573- * @param sv The shrink stratgey for values.
575+ * @param sv The shrink strategy for values.
574576 * @return A shrink strategy for concurrent hash maps.
575577 */
576578 public static <K , V > Shrink <ConcurrentHashMap <K , V >> shrinkConcurrentHashMap (final Shrink <K > sk , final Shrink <V > sv ) {
@@ -676,23 +678,20 @@ public static <A> Shrink<SynchronousQueue<A>> shrinkSynchronousQueue(final Shrin
676678 /**
677679 * A shrink strategy for big integers.
678680 */
679- public static final Shrink <BigInteger > shrinkBigInteger =
680- shrinkP2 (shrinkByte , shrinkArray (shrinkByte )).map (bs -> {
681- final byte [] x = new byte [bs ._2 ().length () + 1 ];
682-
683- for (int i = 0 ; i < bs ._2 ().array ().length ; i ++) {
684- x [i ] = bs ._2 ().get (i );
685- }
686-
687- x [bs ._2 ().length ()] = bs ._1 ();
681+ public static final Shrink <BigInteger > shrinkBigInteger = shrink (i -> {
682+ final Equal <BigInteger > eq = Equal .bigintEqual ;
683+ final BigInteger two = BigInteger .valueOf (2L );
684+ if (eq .eq (i , ZERO )) {
685+ return nil ();
686+ } else {
687+ final Stream <BigInteger > is = cons (ZERO ,
688+ () -> iterate (x -> x .divide (two ), i )
689+ .takeWhile (x2 -> eq .notEq (x2 , ZERO ))
690+ .map (i ::subtract ));
688691
689- return new BigInteger (x );
690- }, i -> {
691- final byte [] b = i .toByteArray ();
692- final Byte [] x = new Byte [b .length - 1 ];
693- arraycopy (b , 0 , x , 0 , b .length - 1 );
694- return p (b [0 ], array (x ));
695- });
692+ return Ord .bigintOrd .isLessThan (i , ZERO ) ? cons (i .negate (), () -> is ) : is ;
693+ }
694+ });
696695
697696 /**
698697 * A shrink strategy for big decimals.
0 commit comments