{"version":3,"sources":["../../../src/utils/geohash.ts"],"sourcesContent":["import { v } from '../api'\n\nconst Base32Chars = '0123456789bcdefghjkmnpqrstuvwxyz'\nconst Base2Chars = '01'\n\nfunction base10ToBaseX(num: number, base: number, chars: string) {\n\tconst charsObj = Object.fromEntries(\n\t\tchars\n\t\t\t.toLowerCase()\n\t\t\t.split('')\n\t\t\t.map((value, index) => [index, value]),\n\t)\n\tconst bits: string[] = []\n\tif (num === 0) return '0'\n\twhile (num > 0) {\n\t\tbits.push(charsObj[num % base] ?? '')\n\t\tnum = Math.floor(num / base)\n\t}\n\treturn bits.reverse().join('')\n}\n\nfunction baseXToBase10(num: string, base: number, chars: string) {\n\tconst charsObj = Object.fromEntries(\n\t\tchars\n\t\t\t.toLowerCase()\n\t\t\t.split('')\n\t\t\t.map((value, index) => [value, index]),\n\t)\n\n\treturn num\n\t\t.toLowerCase()\n\t\t.split('')\n\t\t.reduce((acc, cur, index, arr) => {\n\t\t\tconst pos = charsObj[cur] ?? 0\n\t\t\treturn acc + pos * Math.pow(base, arr.length - index - 1)\n\t\t}, 0)\n}\n\nfunction dichotomy(min: number, max: number, bits: string) {\n\tconst res = bits\n\t\t.split('')\n\t\t.concat('')\n\t\t.reduce(\n\t\t\t(acc, cur) => {\n\t\t\t\tconst mid = (min + max) / 2\n\t\t\t\tconst error = (max - min) / 2\n\t\t\t\tacc.mid = mid\n\t\t\t\tacc.error = error\n\t\t\t\tif (cur === '1') min = mid\n\t\t\t\telse max = mid\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{ mid: 0, error: 0 },\n\t\t)\n\tconst value = res.mid - res.error\n\treturn { value, interval: res.error * 2 }\n}\n\nfunction parseCoords(hash: string) {\n\thash = v.assert(v.string().pipe(v.min(1)), hash)\n\tconst base10 = baseXToBase10(hash, 32, Base32Chars)\n\tconst base2 = base10ToBaseX(base10, 2, Base2Chars).padStart(hash.length * 5, '0')\n\n\treturn base2.split('').reduce(\n\t\t(acc, cur, index) => {\n\t\t\tif (index % 2 === 0) acc.long += cur\n\t\t\telse acc.lat += cur\n\t\t\treturn acc\n\t\t},\n\t\t{ lat: '', long: '' },\n\t)\n}\n\nfunction wrap(num: number, base: number) {\n\tif (num < -base) num = num + base * 2\n\tif (num > +base) num = num - base * 2\n\treturn num\n}\n\nexport function decode(hash: string): [number, number] {\n\tconst coords = parseCoords(hash)\n\tconst lat = dichotomy(-90, 90, coords.lat).value\n\tconst long = dichotomy(-180, 180, coords.long).value\n\treturn [lat, long]\n}\n\nexport function encode(coords: [number, number]): string {\n\tcoords = v.assert(v.tuple([v.number(), v.number()]), coords)\n\n\tlet idx = 0,\n\t\tbit = 0,\n\t\tevenBit = true,\n\t\tgeohash = ''\n\tconst mins = [-90, -180],\n\t\tmaxs = [90, 180]\n\n\twhile (geohash.length < 18) {\n\t\tconst key = evenBit ? 1 : 0\n\t\tconst mid = (mins[key] + maxs[key]) / 2\n\t\tif (coords[key] >= mid) {\n\t\t\tidx = idx * 2 + 1\n\t\t\tmins[key] = mid\n\t\t} else {\n\t\t\tidx = idx * 2\n\t\t\tmaxs[key] = mid\n\t\t}\n\t\tevenBit = !evenBit\n\n\t\tbit += 1\n\t\tif (bit === 5) {\n\t\t\tgeohash += base10ToBaseX(idx, 32, Base32Chars)\n\t\t\tbit = idx = 0\n\t\t}\n\t}\n\treturn geohash.replace(/0+$/, '')\n}\n\nexport function neighbors(hash: string) {\n\tconst coords = parseCoords(hash)\n\tconst lat = dichotomy(-90, 90, coords.lat)\n\tconst long = dichotomy(-180, 180, coords.long)\n\tconst neighbors = [\n\t\t[lat.value - lat.interval, long.value - long.interval],\n\t\t[lat.value - lat.interval, long.value],\n\t\t[lat.value - lat.interval, long.value + long.interval],\n\n\t\t[lat.value, long.value - long.interval],\n\t\t[lat.value, long.value + long.interval],\n\n\t\t[lat.value + lat.interval, long.value - long.interval],\n\t\t[lat.value + lat.interval, long.value],\n\t\t[lat.value + lat.interval, long.value + long.interval],\n\t].map(([lat, long]) => encode([wrap(lat, 90), wrap(long, 180)]))\n\treturn {\n\t\tbl: neighbors[0],\n\t\tbc: neighbors[1],\n\t\tbr: neighbors[2],\n\t\tcl: neighbors[3],\n\t\tcr: neighbors[4],\n\t\ttl: neighbors[5],\n\t\ttc: neighbors[6],\n\t\ttr: neighbors[7],\n\t}\n}\n"],"mappings":"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","names":["geohash_exports","__export","decode","encode","neighbors","__toCommonJS","import_api","Base32Chars","Base2Chars","base10ToBaseX","num","base","chars","charsObj","value","index","bits","baseXToBase10","acc","cur","arr","pos","dichotomy","min","max","res","mid","error","parseCoords","hash","base10","wrap","coords","lat","long","idx","bit","evenBit","geohash","mins","maxs","key"]}