@SuppressWarnings("unchecked")
protected final Pair<AtomicType[], AtomicType>[] signatures() {
final Pair<AtomicType[], AtomicType>[] s = new Pair[] {
// op:numeric-add(xs:integer, xs:integer) as xs:integer
new Pair(new AtomicType[] { IntegerType.INTEGER, IntegerType.INTEGER }, IntegerType.INTEGER),
// op:numeric-add(xs:decimal, xs:decimal) as xs:decimal
new Pair(new AtomicType[] { DecimalType.DECIMAL, DecimalType.DECIMAL }, DecimalType.DECIMAL),
// op:numeric-add(xs:float, xs:float) as xs:float
new Pair(new AtomicType[] { FloatType.FLOAT, FloatType.FLOAT }, FloatType.FLOAT),
// workaround
new Pair(new AtomicType[] { DecimalType.DECIMAL, FloatType.FLOAT }, FloatType.FLOAT),
new Pair(new AtomicType[] { FloatType.FLOAT, DecimalType.DECIMAL }, FloatType.FLOAT),
// op:numeric-add(xs:double, xs:double) as xs:double
new Pair(new AtomicType[] { DoubleType.DOUBLE, DoubleType.DOUBLE }, DoubleType.DOUBLE),
// op:add-yearMonthDuration-to-date(xs:date, xdt:yearMonthDuration) as xs:date
new Pair(new AtomicType[] { DateType.DATE, YearMonthDurationType.YEARMONTH_DURATION }, DateType.DATE),
// op:add-yearMonthDuration-to-date(xdt:yearMonthDuration, xs:date) as xs:date
new Pair(new AtomicType[] { YearMonthDurationType.YEARMONTH_DURATION, DateType.DATE }, DateType.DATE),
// op:add-dayTimeDuration-to-date(xs:date, xdt:dayTimeDuration) as xs:date
new Pair(new AtomicType[] { DateType.DATE, DayTimeDurationType.DAYTIME_DURATION }, DateType.DATE),
// op:add-dayTimeDuration-to-date(xdt:dayTimeDuration, xs:date) as xs:date
new Pair(new AtomicType[] { DayTimeDurationType.DAYTIME_DURATION, DateType.DATE }, DateType.DATE),
// op:add-dayTimeDuration-to-time(xs:time, xdt:dayTimeDuration) as xs:time
new Pair(new AtomicType[] { TimeType.TIME, DayTimeDurationType.DAYTIME_DURATION }, TimeType.TIME),
// op:add-dayTimeDuration-to-time(xdt:dayTimeDuration, xs:time) as xs:time
new Pair(new AtomicType[] { DayTimeDurationType.DAYTIME_DURATION, TimeType.TIME }, TimeType.TIME),
// op:add-yearMonthDuration-to-dateTime(xs:dateTime, xdt:yearMonthDuration) as xs:dateTime
new Pair(new AtomicType[] { DateTimeType.DATETIME,
YearMonthDurationType.YEARMONTH_DURATION }, DateTimeType.DATETIME),
// op:add-yearMonthDuration-to-dateTime(xdt:yearMonthDuration, xs:dateTime) as xs:dateTime
new Pair(new AtomicType[] { YearMonthDurationType.YEARMONTH_DURATION,
DateTimeType.DATETIME }, DateTimeType.DATETIME),
// op:add-dayTimeDuration-to-dateTime(xs:dateTime, xdt:dayTimeDuration) as xs:dateTime
new Pair(new AtomicType[] { DateTimeType.DATETIME,
DayTimeDurationType.DAYTIME_DURATION }, DateTimeType.DATETIME),
// op:add-dayTimeDuration-to-dateTime(xdt:dayTimeDuration, xs:dateTime) as xs:dateTime
new Pair(new AtomicType[] { DayTimeDurationType.DAYTIME_DURATION,
DateTimeType.DATETIME }, DateTimeType.DATETIME),
// op:add-yearMonthDurations(xdt:yearMonthDuration, xdt:yearMonthDuration) as xdt:yearMonthDuration
new Pair(new AtomicType[] { YearMonthDurationType.YEARMONTH_DURATION,
YearMonthDurationType.YEARMONTH_DURATION }, YearMonthDurationType.YEARMONTH_DURATION),
// op:add-dayTimeDurations(xdt:dayTimeDuration, xdt:dayTimeDuration) as xdt:dayTimeDuration
new Pair(new AtomicType[] { DayTimeDurationType.DAYTIME_DURATION,
DayTimeDurationType.DAYTIME_DURATION }, DayTimeDurationType.DAYTIME_DURATION),
// workaround
new Pair(new AtomicType[] { NumericType.getInstance(), NumericType.getInstance() }, DoubleType.DOUBLE),
new Pair(new AtomicType[] { UntypedAtomicType.UNTYPED_ATOMIC,
NumericType.getInstance() }, DoubleType.DOUBLE),
new Pair(new AtomicType[] { NumericType.getInstance(),
UntypedAtomicType.UNTYPED_ATOMIC }, DoubleType.DOUBLE),
new Pair(new AtomicType[] { UntypedAtomicType.UNTYPED_ATOMIC,
UntypedAtomicType.UNTYPED_ATOMIC }, DoubleType.DOUBLE) };
return s;
}