From 6a05b257b6d5cb33901ed0978c2da552d35bb99e Mon Sep 17 00:00:00 2001 From: Stephannie Jimenez Date: Tue, 26 Sep 2023 14:55:46 -0500 Subject: [PATCH] fix: use nextGraphemeCluster in implementation, fix tests and docstrings --- .../base/reverse-grapheme-clusters/lib/main.js | 18 ++++++++++++------ .../@stdlib/string/reverse/docs/types/test.ts | 10 ++++++++++ .../@stdlib/string/reverse/lib/main.js | 1 + .../@stdlib/string/reverse/test/test.js | 4 ++-- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/node_modules/@stdlib/string/base/reverse-grapheme-clusters/lib/main.js b/lib/node_modules/@stdlib/string/base/reverse-grapheme-clusters/lib/main.js index 9815ac5e6e6..f2405c94280 100644 --- a/lib/node_modules/@stdlib/string/base/reverse-grapheme-clusters/lib/main.js +++ b/lib/node_modules/@stdlib/string/base/reverse-grapheme-clusters/lib/main.js @@ -20,7 +20,7 @@ // MODULES // -var prevGraphemeClusterBreak = require( '@stdlib/string/prev-grapheme-cluster-break' ); +var nextGraphemeClusterBreak = require( '@stdlib/string/next-grapheme-cluster-break' ); // MAIN // @@ -52,18 +52,24 @@ var prevGraphemeClusterBreak = require( '@stdlib/string/prev-grapheme-cluster-br * // returns '🐸🐰🐷🐮🐶' */ function reverse( str ) { + var cluster; var out; var idx; var brk; var i; out = ''; - idx = str.length - 1; - while ( idx >= 0 ) { - brk = prevGraphemeClusterBreak( str, idx ); - for ( i = brk + 1; i <= idx; i++ ) { - out += str.charAt( i ); + idx = 0; + while ( idx < str.length ) { + brk = nextGraphemeClusterBreak( str, idx ); + if ( brk === -1 ) { + brk = str.length; } + cluster = ''; + for ( i = idx; i < brk; i++ ) { + cluster += str.charAt( i ); + } + out = cluster + out; idx = brk; } return out; diff --git a/lib/node_modules/@stdlib/string/reverse/docs/types/test.ts b/lib/node_modules/@stdlib/string/reverse/docs/types/test.ts index 0a961943a0b..a4fd92322c9 100644 --- a/lib/node_modules/@stdlib/string/reverse/docs/types/test.ts +++ b/lib/node_modules/@stdlib/string/reverse/docs/types/test.ts @@ -47,6 +47,16 @@ import reverseString = require( './index' ); reverseString( ( x: number ): number => x, {} ); // $ExpectError } +// The compiler throws an error if the function is provided a value other than an object as second argument... +{ + reverseString( 'abc', true ); // $ExpectError + reverseString( 'abc', false ); // $ExpectError + reverseString( 'abc', null ); // $ExpectError + reverseString( 'abc', '' ); // $ExpectError + reverseString( 'abc', [] ); // $ExpectError + reverseString( 'abc', ( x: number ): number => x ); // $ExpectError +} + // The compiler throws an error if the function is provided an invalid `mode` option... { reverseString( 'abc', { 'mode': true } ); // $ExpectError diff --git a/lib/node_modules/@stdlib/string/reverse/lib/main.js b/lib/node_modules/@stdlib/string/reverse/lib/main.js index 3828e1d1d55..a61f598ac3f 100644 --- a/lib/node_modules/@stdlib/string/reverse/lib/main.js +++ b/lib/node_modules/@stdlib/string/reverse/lib/main.js @@ -48,6 +48,7 @@ var isMode = contains( MODES ); * * @param {string} str - input string * @param {Options} [options] - options +* @param {string} [options.mode="grapheme"] - type of "character" to return (must be either `grapheme`, `code_point`, or `code_unit`) * @throws {TypeError} must provide a string primitive * @throws {TypeError} options argument must be an object * @throws {TypeError} must provide valid options diff --git a/lib/node_modules/@stdlib/string/reverse/test/test.js b/lib/node_modules/@stdlib/string/reverse/test/test.js index 44b5eb47f69..9d1debfc52d 100644 --- a/lib/node_modules/@stdlib/string/reverse/test/test.js +++ b/lib/node_modules/@stdlib/string/reverse/test/test.js @@ -224,8 +224,8 @@ tape( 'the function reverses the first string (mode=grapheme)', function test( t out = reverseString( '🌷', opts ); t.strictEqual( out, '🌷', 'returns expected value' ); - out = reverseString( '👉🏿', opts ); - t.strictEqual( out, '🏿👉', 'returns expected value' ); + out = reverseString( '👉🏿🌷', opts ); + t.strictEqual( out, '🌷👉🏿', 'returns expected value' ); t.end(); });