// Path: src/main/java/com/shapesecurity/functional/Pair.java
// @CheckReturnValue
// public final class Pair<A, B> {
//     public final A left;
//     public final B right;
// 
//     @Deprecated
//     public final A a;
//     @Deprecated
//     public final B b;
// 
//     /**
//      * Constructor method to utilize type inference.
//      * @param left first component
//      * @param right second component
//      * @param <A> type of the first component
//      * @param <B> type of the second component
//      * @return the pair
//      */
//     @Nonnull
//     public static <A, B> Pair<A, B> of(A left, B right) {
//         return new Pair<>(left, right);
//     }
// 
//     @Nonnull
//     @Deprecated
//     public static <A, B> Pair<A, B> make(A left, B right) {
//         return Pair.of(left, right);
//     }
// 
//     public Pair(A left, B right) {
//         super();
//         this.left = this.a = left;
//         this.right = this.b = right;
// 
//     }
// 
//     public A left() {
//         return this.left;
//     }
// 
//     public B right() {
//         return this.right;
//     }
// 
//     @Nonnull
//     public Pair<B, A> swap() {
//         return new Pair<>(this.right, this.left);
//     }
// 
//     @Nonnull
//     public <A1, B1> Pair<A1, B1> map(@Nonnull F<A, A1> fA, @Nonnull F<B, B1> fB) {
//         return new Pair<>(fA.apply(this.left), fB.apply(this.right));
//     }
// 
//     @Nonnull
//     public <A1> Pair<A1, B> mapLeft(@Nonnull F<A, A1> f) {
//         return new Pair<>(f.apply(this.left), this.right);
//     }
// 
//     @Nonnull
//     @Deprecated
//     public <A1> Pair<A1, B> mapA(@Nonnull F<A, A1> f) {
//         return this.mapLeft(f);
//     }
// 
//     @Nonnull
//     public <B1> Pair<A, B1> mapRight(@Nonnull F<B, B1> f) {
//         return new Pair<>(this.left, f.apply(this.right));
//     }
// 
//     @Nonnull
//     @Deprecated
//     public <B1> Pair<A, B1> mapB(@Nonnull F<B, B1> f) {
//         return this.mapRight(f);
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof Pair &&
//                 ((Pair<A, B>) obj).left.equals(this.left) &&
//                 ((Pair<A, B>) obj).right.equals(this.right);
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = HashCodeBuilder.put(HashCodeBuilder.init(), "Pair");
//         hash = HashCodeBuilder.put(hash, this.left);
//         return HashCodeBuilder.put(hash, this.right);
//     }
// }


import com.shapesecurity.functional.Pair;
import javax.annotation.Nonnull;
package com.shapesecurity.functional.data;



public final class FreePairingMonoid<A, B> implements Monoid<Pair<A, B>> {
    @Nonnull
    private final Monoid<A> monoidA;
    @Nonnull
    private final Monoid<B> monoidB;

    public FreePairingMonoid(@Nonnull Monoid<A> monoidA, @Nonnull Monoid<B> monoidB) {
        this.monoidA = monoidA;
        this.monoidB = monoidB;
    }

    @Nonnull
    @Override
    public Pair<A, B> identity() {
        return new Pair<>(this.monoidA.identity(), this.monoidB.identity());
    }

    @Nonnull
// Path: src/main/java/com/shapesecurity/functional/Pair.java
// @CheckReturnValue
// public final class Pair<A, B> {
//     public final A left;
//     public final B right;
// 
//     @Deprecated
//     public final A a;
//     @Deprecated
//     public final B b;
// 
//     /**
//      * Constructor method to utilize type inference.
//      * @param left first component
//      * @param right second component
//      * @param <A> type of the first component
//      * @param <B> type of the second component
//      * @return the pair
//      */
//     @Nonnull
//     public static <A, B> Pair<A, B> of(A left, B right) {
//         return new Pair<>(left, right);
//     }
// 
//     @Nonnull
//     @Deprecated
//     public static <A, B> Pair<A, B> make(A left, B right) {
//         return Pair.of(left, right);
//     }
// 
//     public Pair(A left, B right) {
//         super();
//         this.left = this.a = left;
//         this.right = this.b = right;
// 
//     }
// 
//     public A left() {
//         return this.left;
//     }
// 
//     public B right() {
//         return this.right;
//     }
// 
//     @Nonnull
//     public Pair<B, A> swap() {
//         return new Pair<>(this.right, this.left);
//     }
// 
//     @Nonnull
//     public <A1, B1> Pair<A1, B1> map(@Nonnull F<A, A1> fA, @Nonnull F<B, B1> fB) {
//         return new Pair<>(fA.apply(this.left), fB.apply(this.right));
//     }
// 
//     @Nonnull
//     public <A1> Pair<A1, B> mapLeft(@Nonnull F<A, A1> f) {
//         return new Pair<>(f.apply(this.left), this.right);
//     }
// 
//     @Nonnull
//     @Deprecated
//     public <A1> Pair<A1, B> mapA(@Nonnull F<A, A1> f) {
//         return this.mapLeft(f);
//     }
// 
//     @Nonnull
//     public <B1> Pair<A, B1> mapRight(@Nonnull F<B, B1> f) {
//         return new Pair<>(this.left, f.apply(this.right));
//     }
// 
//     @Nonnull
//     @Deprecated
//     public <B1> Pair<A, B1> mapB(@Nonnull F<B, B1> f) {
//         return this.mapRight(f);
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public boolean equals(Object obj) {
//         return obj == this || obj instanceof Pair &&
//                 ((Pair<A, B>) obj).left.equals(this.left) &&
//                 ((Pair<A, B>) obj).right.equals(this.right);
//     }
// 
//     @Override
//     public int hashCode() {
//         int hash = HashCodeBuilder.put(HashCodeBuilder.init(), "Pair");
//         hash = HashCodeBuilder.put(hash, this.left);
//         return HashCodeBuilder.put(hash, this.right);
//     }
// }


// Path: src/main/java/com/shapesecurity/functional/data/FreePairingMonoid.java
import com.shapesecurity.functional.Pair;
import javax.annotation.Nonnull;

package com.shapesecurity.functional.data;



public final class FreePairingMonoid<A, B> implements Monoid<Pair<A, B>> {
    @Nonnull
    private final Monoid<A> monoidA;
    @Nonnull
    private final Monoid<B> monoidB;

    public FreePairingMonoid(@Nonnull Monoid<A> monoidA, @Nonnull Monoid<B> monoidB) {
        this.monoidA = monoidA;
        this.monoidB = monoidB;
    }

    @Nonnull
    @Override
    public Pair<A, B> identity() {
        return new Pair<>(this.monoidA.identity(), this.monoidB.identity());
    }

    @Nonnull
    @Override