dts-element-fp
Version:
typescript definition generator for functional programming
55 lines (54 loc) • 2.68 kB
JavaScript
;
exports.__esModule = true;
var dts = require("dts-element");
var R = require("ramda");
var ensure_1 = require("./ensure");
function sort_signatures(signatures, options) {
var is_placeholder = options.is_placeholder;
var _a = R.partition(function (x) { return get_parameters(x.signature).length === 0; }, signatures.map(function (signature, index) { return ({ signature: signature, index: index }); })), selectables = _a[0], normals = _a[1];
var sorted_normals = R.sort(function (data1, data2) {
return R.when(R.equals(0), R.always(data1.index - data2.index))(get_signatures_order(data1.signature, data2.signature));
}, normals);
var sorted_selectables = R.sort(function (data1, data2) {
return R.when(R.equals(0), R.always(data1.index - data2.index))(get_parameters_order(ensure_1.ensure(get_type(data1.signature)["return"], dts.is_function_type)
.parameters, ensure_1.ensure(get_type(data2.signature)["return"], dts.is_function_type)
.parameters));
}, selectables).reverse();
return sorted_normals.slice(0, -1).concat(sorted_selectables, sorted_normals.slice(-1)).map(function (x) { return x.signature; });
function get_signatures_order(signature1, signature2) {
var _a = [signature1, signature2].map(get_parameters), parameters1 = _a[0], parameters2 = _a[1];
return get_parameters_order(parameters1, parameters2);
}
function get_parameters_order(parameters1, parameters2) {
return parameters1.length !== parameters2.length
? get_length_point(parameters2) - get_length_point(parameters1)
: get_placeholder_point(parameters2) - get_placeholder_point(parameters1);
}
function get_type(signature) {
var function_declaration = ensure_1.ensure(signature.owned, dts.is_function_declaration);
return function_declaration.type;
}
function get_parameters(signature) {
return get_type(signature).parameters;
}
/**
* ascending order
*/
function get_length_point(parameters) {
return -parameters.length;
}
/**
* placeholder should be as front as possible
*/
function get_placeholder_point(parameters) {
var get_inverse_index = R.subtract(parameters.length);
var point = parameters.reduce(function (current_point, parameter, index) {
return is_placeholder(parameter.type)
? current_point
: (current_point + 1) << get_inverse_index(index);
}, // tslint:disable-line:no-bitwise restrict-plus-operands
0);
return R.negate(point);
}
}
exports.sort_signatures = sort_signatures;