All files / base/gconjoin/lib ndarray.js

73.46% Statements 72/98
100% Branches 1/1
0% Functions 0/2
73.46% Lines 72/98

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 991x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x               1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                       1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var isUndefinedOrNull = require( '@stdlib/assert/is-undefined-or-null' );
var resolveGetter = require( '@stdlib/array/base/resolve-getter' );
var gjoin = require( '@stdlib/blas/ext/base/gjoin' ).ndarray;
 
 
// VARIABLES //
 
var SEP = ', ';
var SPACE = ' ';
 
 
// FUNCTIONS //
 
/**
* Returns the string representation of an array element.
*
* @private
* @param {Function} get - accessor function
* @param {Collection} x - input array
* @param {integer} idx - element index
* @returns {string} string representation
*/
function str( get, x, idx ) {
	var v = get( x, idx );
	if ( isUndefinedOrNull( v ) ) {
		return '';
	}
	return String( v );
}
 
 
// MAIN //
 
/**
* Returns a string created by joining strided array elements into a human-readable list using a conjunction and alternative indexing semantics.
*
* @param {PositiveInteger} N - number of indexed elements
* @param {string} prefix - string to prepend
* @param {string} suffix - string to append
* @param {string} conjunction - conjunction before the last element
* @param {boolean} oxfordComma - boolean specifying whether to include an Oxford comma
* @param {Collection} x - input array
* @param {integer} strideX - stride length
* @param {NonNegativeInteger} offsetX - starting index
* @returns {string} joined string
*
* @example
* var x = [ 1, 2, 3, 4 ];
*
* var out = gconjoin( x.length, '', '', 'and', true, x, 1, 0 );
* // returns '1, 2, 3, and 4'
*/
function gconjoin( N, prefix, suffix, conjunction, oxfordComma, x, strideX, offsetX ) { // eslint-disable-line max-len
	var last;
	var out;
	var get;

	if ( N <= 0 ) {
		return prefix + suffix;
	}
	if ( conjunction === '' || N === 1 ) {
		return prefix + gjoin( N, SEP, x, strideX, offsetX ) + suffix;
	}
	get = resolveGetter( x );
	out = prefix + gjoin( N-1, SEP, x, strideX, offsetX );
	last = str( get, x, offsetX + ( (N-1) * strideX ) );
	if ( N >= 3 && oxfordComma ) {
		return out + SEP + conjunction + SPACE + last + suffix;
	}
	return out + SPACE + conjunction + SPACE + last + suffix;
}
 
 
// EXPORTS //
 
module.exports = gconjoin;