import {
QUERY_CHANGE_THRESHOLD as t,
QUERY_UP_MESSAGE_THRESHOLD as e,
QUERY_DOWN_MESSAGE_THRESHOLD as r,
SUBSCRIBE_MESSAGE_THRESHOLD as n,
QUERY_FIRST_LOAD_COUNT as o,
} from "../chat.constant"
export const isSeqInQuery = (t, e) => !(t < 0) && e.lte >= t && e.gte <= t
export const isQueryValid = (t) => {
if (!t) return !1
const { gte: e, lte: r } = t
if (void 0 !== e && (!Number.isInteger(e) || e < 0)) return !1
if (void 0 !== r && (!Number.isInteger(r) || r < 0)) return !1
if (void 0 !== e && void 0 !== r) {
if (e > r) return !1
if (e < 0 || r < 0) return !1
}
return !0
}
export const hasQueryIntersection = (t, e) => t.gte <= e.lte && e.gte <= t.lte
export const getQueryCount = (t) =>
isQueryValid(t) && Number.isInteger(t.gte) && Number.isInteger(t.lte) ? t.lte - t.gte + 1 : 0
export function isQueryChanged(e, r, n = {}) {
if (!e || !r || !isQueryValid(r)) return !1
const { gte: o, lte: l } = e,
u =
Number.isInteger(o) && Number.isInteger(r.gte)
? Math.abs(o - r.gte) > (n?.gte ?? t)
: o !== r.gte,
s =
Number.isInteger(l) && Number.isInteger(r.lte)
? Math.abs(l - r.lte) > (n?.lte ?? t)
: l !== r.lte
return u || s
}
export const createFirstQuery = ({ count: t }) => ({
gte: Math.max(0, t - 1 - o),
lte: Math.max(0, t - 1),
})
export const createFirstMiddleQuery = ({ count: t, bottomSeq: e }) => ({
gte: Math.max(0, e - o),
lte: Math.min(e, t - 1),
})
export const createRawQuery = ({ count: t, top: e, bottom: r }) => ({
gte: Math.max(0, e),
lte: Math.min(r, t - 1),
})
export const createFetchQuery = ({ gte: t, lte: n }, o) => ({
gte: Math.max(0, t - e),
lte: Math.min(n + r, o - 1),
})
export const createSubscribeQuery = ({ gte: t, lte: e }, r) => ({
gte: Math.max(0, t - n),
lte: Math.min(e + n, r - 1),
})
export const joinTwoQueryOrNull = (t, e) =>
t.lte >= e.gte - 1 && e.lte >= t.gte - 1
? { gte: Math.min(t.gte, e.gte), lte: Math.max(t.lte, e.lte) }
: null
export const joinQueries = (t) => {
const e = [...t],
{ length: r } = e
for (let t = r - 1; t > 0; t -= 1) {
const r = e[t]
for (let n = t - 1; n >= 0; n -= 1) {
const o = e[n],
l = joinTwoQueryOrNull(r, o)
if (l) {
;((e[n] = l), (e[t] = null))
break
}
}
}
return e.filter((t) => t)
}
export const limitQueries = (t, e, r) => {
const n = []
for (const o of t)
if (o.lte >= e && o.gte <= r) {
const t = Math.max(o.gte, e),
l = Math.min(o.lte, r)
n.push(t === o.gte && l === o.lte ? o : { gte: t, lte: l })
}
return n
}
export const substractQuery = (t, e) => {
let r = t.gte,
n = t.lte
return (
r >= e.gte && r <= e.lte && (r = e.lte + 1),
n <= e.lte && n >= e.gte && (n = e.gte - 1),
r > n ? null : r === t.gte && n === t.lte ? t : { gte: r, lte: n }
)
}
export const substractQueries = (t, e) => {
let r = t,
n = r
do {
n = r
for (const t of e) if (((r = substractQuery(r, t)), !r)) return null
} while (n !== r)
return r
}