/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.lang.enhancements;
import gw.lang.function.IBlock;
import java.util.Comparator;
@SuppressWarnings({"UnusedDeclaration"}) // Used in Gosu core enhancements
public class BlockSortByComparator implements Comparator
{
private final Object[] args = new Object[1];
private boolean _ascending;
private IBlock _bytecodeBlock;
private Comparator _comparator;
public BlockSortByComparator( Object block, boolean ascending )
{
this(block, ascending, null);
}
public BlockSortByComparator (Object block, boolean ascending, Comparator comparator) {
_bytecodeBlock = (IBlock)block;
_ascending = ascending;
_comparator = comparator;
}
public int compare( Object o1, Object o2 )
{
args[0] = o1;
Comparable c1 = invoke( this.args );
this.args[0] = o2;
Comparable c2 = invoke( this.args );
if( c1 == null && c2 == null )
{
return 0;
}
else if( c1 == null )
{
return _ascending ? -1 : 1;
}
else if( c2 == null )
{
return _ascending ? 1 : -1;
}
//noinspection unchecked
int cmp = _comparator != null
? _comparator.compare(c1, c2)
: c1.compareTo( c2 );
return _ascending ? cmp : (cmp < 0 ? 1 : - cmp);
}
private Comparable invoke( Object[] args )
{
return (Comparable)_bytecodeBlock.invokeWithArgs( args );
}
}