mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 18:52:25 -05:00 
			
		
		
		
	- codeberg.org/gruf/go-bytesize v1.0.3 -> v1.0.4 - codeberg.org/gruf/go-kv/v2 v2.0.6 -> v2.0.7 - codeberg.org/gruf/go-mutexes v1.5.2 -> v1.5.3 - codeberg.org/gruf/go-structr v0.9.7 -> v0.9.8 - codeberg.org/gruf/go-ffmpreg v0.6.8 -> v0.6.9 - github.com/tomnomnom/linkheader HEAD@2018 -> HEAD@2025 all of the above codeberg.org/gruf updates are in preparation for Go1.25, except for bytesize, and also ffmpreg which is a rebuild with the latest version of ffmpeg (v5.1.7) Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4386 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // GoToSocial
 | |
| // Copyright (C) GoToSocial Authors admin@gotosocial.org
 | |
| // SPDX-License-Identifier: AGPL-3.0-or-later
 | |
| //
 | |
| // This program is free software: you can redistribute it and/or modify
 | |
| // it under the terms of the GNU Affero General Public License as published by
 | |
| // the Free Software Foundation, either version 3 of the License, or
 | |
| // (at your option) any later version.
 | |
| //
 | |
| // This program is distributed in the hope that it will be useful,
 | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| // GNU Affero General Public License for more details.
 | |
| //
 | |
| // You should have received a copy of the GNU Affero General Public License
 | |
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| package queue
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"codeberg.org/gruf/go-structr"
 | |
| )
 | |
| 
 | |
| // StructQueue wraps a structr.Queue{} to
 | |
| // provide simple index caching by name.
 | |
| type StructQueue[StructType any] struct {
 | |
| 	queue structr.QueueCtx[StructType]
 | |
| 	index map[string]*structr.Index
 | |
| }
 | |
| 
 | |
| // Init initializes queue with structr.QueueConfig{}.
 | |
| func (q *StructQueue[T]) Init(config structr.QueueConfig[T]) {
 | |
| 	q.index = make(map[string]*structr.Index, len(config.Indices))
 | |
| 	// q.queue = structr.QueueCtx[T]{}
 | |
| 	q.queue.Init(config)
 | |
| 	for _, cfg := range config.Indices {
 | |
| 		q.index[cfg.Fields] = q.queue.Index(cfg.Fields)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Pop: see structr.Queue{}.PopFront().
 | |
| func (q *StructQueue[T]) Pop() (value T, ok bool) {
 | |
| 	values := q.queue.PopFrontN(1)
 | |
| 	if ok = (len(values) > 0); !ok {
 | |
| 		return
 | |
| 	}
 | |
| 	value = values[0]
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // PopCtx: see structr.QueueCtx{}.PopFront().
 | |
| func (q *StructQueue[T]) PopCtx(ctx context.Context) (value T, ok bool) {
 | |
| 	return q.queue.PopFront(ctx)
 | |
| }
 | |
| 
 | |
| // Push: see structr.Queue.PushBack().
 | |
| func (q *StructQueue[T]) Push(values ...T) {
 | |
| 	q.queue.PushBack(values...)
 | |
| }
 | |
| 
 | |
| // Delete pops (and drops!) all queued entries under index with key.
 | |
| func (q *StructQueue[T]) Delete(index string, key ...any) {
 | |
| 	_ = q.queue.Pop(q.index[index], structr.MakeKey(key...))
 | |
| }
 | |
| 
 | |
| // Len: see structr.Queue{}.Len().
 | |
| func (q *StructQueue[T]) Len() int {
 | |
| 	return q.queue.Len()
 | |
| }
 | |
| 
 | |
| // Wait returns current wait channel, which may be
 | |
| // blocked on to awaken when new value pushed to queue.
 | |
| func (q *StructQueue[T]) Wait() <-chan struct{} {
 | |
| 	return q.queue.Wait()
 | |
| }
 |