### Question:
RightBoundProcedure implements Procedure<A> { @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof RightBoundProcedure<?>)) { return false; } RightBoundProcedure<?> that = (RightBoundProcedure<?>) obj; return this.procedure.equals(that.procedure) && (null == param ? null == that.param : param.equals(that.param)); } @SuppressWarnings("unchecked") <R> RightBoundProcedure(BinaryProcedure<? super A, ? super R> procedure, R arg); void run(A obj); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString(); static RightBoundProcedure<L> bind(BinaryProcedure<? super L, ? super R> procedure, R arg);  }### Answer:
@Test public void testEquals() throws Exception { Procedure<Object> f = new RightBoundProcedure<Object>(NoOp.INSTANCE,"xyzzy"); assertEquals(f,f); assertObjectsAreEqual(f,new RightBoundProcedure<Object>(NoOp.INSTANCE,"xyzzy")); assertObjectsAreNotEqual(f,NoOp.INSTANCE); assertObjectsAreNotEqual(f,new RightBoundProcedure<Object>(new BinaryFunctionBinaryProcedure<Object, Object>(LeftIdentity.FUNCTION),"xyzzy")); assertObjectsAreNotEqual(f,new RightBoundProcedure<Object>(NoOp.INSTANCE,"foo")); assertObjectsAreNotEqual(f,new RightBoundProcedure<Object>(NoOp.INSTANCE,null)); assertObjectsAreEqual(new RightBoundProcedure<Object>(NoOp.INSTANCE,null),new RightBoundProcedure<Object>(NoOp.INSTANCE,null)); assertObjectsAreNotEqual(new RightBoundProcedure<Object>(new BinarySequence<Object, Object>(),null),new RightBoundProcedure<Object>(NoOp.INSTANCE,null)); assertTrue(!f.equals(null)); }