export function startsWith ( haystack , needle ) { if ( haystack . length < needle . length ) { return false ; } for ( let i = 0 ; i < needle . length ; i ++ ) { if ( haystack [ i ] !== needle [ i ] ) { return false ; } } return true ; } /**
 * Determines if haystack ends with needle.
 */ export function endsWith ( haystack , needle ) { const diff = haystack . length - needle . length ; if ( diff > 0 ) { return haystack . lastIndexOf ( needle ) === diff ; } else if ( diff === 0 ) { return haystack === needle ; } else { return false ; } } export function convertSimple2RegExpPattern ( pattern ) { return pattern . replace ( /[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g , '\\$&' ) . replace ( /[\*]/g , '.*' ) ; } export function repeat ( value , count ) { var s = '' ; while ( count > 0 ) { if ( ( count & 1 ) === 1 ) { s += value ; } value += value ; count = count >>> 1 ; } return s ; } export function extendedRegExp ( pattern ) { let flags = '' ; if ( startsWith ( pattern , '(?i)' ) ) { pattern = pattern . substring ( 4 ) ; flags = 'i' ; } try { return new RegExp ( pattern , flags + 'u' ) ; } catch ( e ) { try { return new RegExp ( pattern , flags ) ; } catch ( e ) { return undefined ; } } }