server: better iterable logic

This commit is contained in:
noirscape 2023-01-04 21:04:53 +01:00
parent 0cc8407d76
commit 07267b9737

View file

@ -2,6 +2,7 @@ import hmac
import logging import logging
from collections import namedtuple from collections import namedtuple
from datetime import datetime from datetime import datetime
from itertools import tee, chain, islice, izip
from typing import Any, Callable, Dict, List, Optional, Tuple from typing import Any, Callable, Dict, List, Optional, Tuple
import sqlalchemy as sa import sqlalchemy as sa
@ -96,6 +97,13 @@ FLAG_MAP = {
model.Post.FLAG_SOUND: "sound", model.Post.FLAG_SOUND: "sound",
} }
# https://stackoverflow.com/a/1012089
def _get_nearby_iter(post_list):
previous_item, current_item, next_item = tee(post_list, 3)
previous_item = chain([None], previous_item)
next_item = chain(islice(next_item, 1, None), [None])
return izip(previous_item, current_item, next_item)
def get_post_security_hash(id: int) -> str: def get_post_security_hash(id: int) -> str:
return hmac.new( return hmac.new(
@ -982,12 +990,10 @@ def get_pools_nearby(
first_post_id = pool.posts[0].post_id, first_post_id = pool.posts[0].post_id,
last_post_id = pool.posts[-1].post_id, last_post_id = pool.posts[-1].post_id,
for idx, pool_post in enumerate(pool.posts): for previous_item, current_item, next_item in _get_nearby_iter(pool.posts):
if post.post_id == pool_post.post_id: if post.post_id == current_item.post_id:
if post.post_id != first_post_id: prev_post_id = previous_item.post_id
prev_post_id = pool.posts[idx-1].post_id next_post_id = next_item.post_id
if post.post_id != last_post_id:
next_post_id = pool.posts[idx+1].post_id
break break
resp_entry = PoolPostsNearby( resp_entry = PoolPostsNearby(