11import { writable } from "svelte/store" ;
22
3- export let searchQuery = writable ( ) ;
3+ export let searchQuery = writable ( '' ) ;
44
55// Mulberry32 PRNG
66function mulberry32 ( seed ) {
77 return function ( ) {
88 let t = ( seed += 0x6d2b79f5 ) ;
99 t = Math . imul ( t ^ ( t >>> 15 ) , t | 1 ) ;
1010 t ^= t + Math . imul ( t ^ ( t >>> 7 ) , t | 61 ) ;
11- return ( ( t ^ ( t >>> 14 ) ) >>> 0 ) / 4294967296 ;
11+ return ( ( t ^ ( t >>> 16 ) ) >>> 0 ) / 4294967296 ;
1212 } ;
1313}
1414
@@ -25,45 +25,58 @@ function generateSeed() {
2525
2626// Fisher-Yates shuffle with optional seed
2727export function shuffleArray ( array ) {
28- const seed = generateSeed ( ) ;
29- const rng = mulberry32 ( seed ) ;
30-
31- for ( let i = array . length - 1 ; i > 0 ; i -- ) {
32- const j = Math . floor ( rng ( ) * ( i + 1 ) ) ;
28+ const rng = mulberry32 ( generateSeed ( ) ) ;
29+ let i = array . length ;
30+ while ( i > 1 ) {
31+ const j = Math . floor ( rng ( ) * i -- ) ;
3332 [ array [ i ] , array [ j ] ] = [ array [ j ] , array [ i ] ] ;
3433 }
35-
3634 return array ;
3735}
3836
3937export function getSearchParameters ( ) {
40- const searchParams = new URLSearchParams ( window . location . search ) ;
4138 const result = { } ;
42- for ( const [ key , value ] of searchParams . entries ( ) ) {
43- if ( result [ key ] ) {
44- // If key already exists, convert to array or push into existing array
45- result [ key ] = Array . isArray ( result [ key ] ) ? [ ...result [ key ] , parseValue ( value ) ] : [ result [ key ] , parseValue ( value ) ] ;
39+ for ( const [ key , value ] of new URLSearchParams ( window . location . search ) ) {
40+ const parsed = parseValue ( value ) ;
41+ if ( key in result ) {
42+ result [ key ] = Array . isArray ( result [ key ] ) ? [ ...result [ key ] , parsed ] : [ result [ key ] , parsed ] ;
4643 } else {
47- result [ key ] = parseValue ( value ) ;
44+ result [ key ] = parsed ;
4845 }
4946 }
5047 return result ;
5148}
5249
50+ /**
51+ * Parses a string value to its appropriate type.
52+ * @param {string } value
53+ * @returns {boolean|number|string|null|undefined }
54+ */
5355export function parseValue ( value ) {
5456 if ( value === "true" ) return true ;
5557 if ( value === "false" ) return false ;
56- if ( ! isNaN ( value ) && value . trim ( ) !== "" ) return Number ( value ) ;
58+ if ( value == null ) return value ;
59+ const trimmed = value . trim ( ) ;
60+ if ( / ^ - ? \d + ( \. \d + ) ? $ / . test ( trimmed ) ) return Number ( trimmed ) ;
5761 return value ;
5862}
5963
64+ /**
65+ * Creates a URL search string from an object of parameters.
66+ * @param {Object } params
67+ * @returns {string }
68+ */
6069export function createSearchParameters ( params ) {
6170 const searchParams = new URLSearchParams ( ) ;
6271 for ( const key in params ) {
63- if ( Array . isArray ( params [ key ] ) ) {
64- params [ key ] . forEach ( ( value ) => searchParams . append ( key , value ) ) ;
72+ const val = params [ key ] ;
73+ if ( val == null ) continue ;
74+ if ( Array . isArray ( val ) ) {
75+ for ( const v of val ) searchParams . append ( key , v ) ;
76+ } else if ( typeof val === "object" ) {
77+ searchParams . set ( key , JSON . stringify ( val ) ) ;
6578 } else {
66- searchParams . set ( key , params [ key ] ) ;
79+ searchParams . set ( key , val ) ;
6780 }
6881 }
6982 return searchParams . toString ( ) ;
0 commit comments