/*
Copyright The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Code generated by informer-gen. DO NOT EDIT.

package v1beta1

import (
	context "context"
	time "time"

	apischedulingv1beta1 "k8s.io/api/scheduling/v1beta1"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	runtime "k8s.io/apimachinery/pkg/runtime"
	schema "k8s.io/apimachinery/pkg/runtime/schema"
	watch "k8s.io/apimachinery/pkg/watch"
	internalinterfaces "k8s.io/client-go/informers/internalinterfaces"
	kubernetes "k8s.io/client-go/kubernetes"
	schedulingv1beta1 "k8s.io/client-go/listers/scheduling/v1beta1"
	cache "k8s.io/client-go/tools/cache"
)

// PodGroupInformer provides access to a shared informer and lister for
// PodGroups. Prefer using the type-safe variant (see [TypedPodGroupInformer]).
type PodGroupInformer interface {
	Informer() cache.SharedIndexInformer
	Lister() schedulingv1beta1.PodGroupLister
}

// TypedPodGroupInformer provides access to a shared informer and lister for
// PodGroups, including the type-safe TypedInformer variant.
// It is a superset of PodGroupInformer.
type TypedPodGroupInformer interface {
	Informer() cache.SharedIndexInformer
	TypedInformer() PodGroupIndexInformer
	Lister() schedulingv1beta1.PodGroupLister
}

// PodGroupIndexInformer is a wrapper around the underlying [cache.SharedIndexInformer]
// with type-safe variants of several methods.
type PodGroupIndexInformer cache.TypedSharedIndexInformer[*apischedulingv1beta1.PodGroup]

// PodGroupHandlerFuncs is a specialization of [cache.TypedResourceEventHandlerFuncs] for PodGroup.
type PodGroupHandlerFuncs = cache.TypedResourceEventHandlerFuncs[*apischedulingv1beta1.PodGroup]

// PodGroupDetailedHandlerFuncs is a specialization of [cache.TypedResourceEventHandlerDetailedFuncs] for PodGroup.
type PodGroupDetailedHandlerFuncs = cache.TypedResourceEventHandlerDetailedFuncs[*apischedulingv1beta1.PodGroup]

// PodGroupFilteringHandler is a specialization of [cache.TypedFilteringResourceEventHandler] for PodGroup.
type PodGroupFilteringHandler = cache.TypedFilteringResourceEventHandler[*apischedulingv1beta1.PodGroup]

// PodGroupIndexers is a specialization of [cache.TypedIndexers] for PodGroup.
type PodGroupIndexers = cache.TypedIndexers[*apischedulingv1beta1.PodGroup]

// DeletedPodGroup is a specialization of [cache.DeletedObject] for PodGroup.
type DeletedPodGroup = cache.DeletedObject[*apischedulingv1beta1.PodGroup]

type podGroupInformer struct {
	factory          internalinterfaces.SharedInformerFactory
	tweakListOptions internalinterfaces.TweakListOptionsFunc
	namespace        string
}

// NewPodGroupInformer constructs a new informer for PodGroup type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
// If you really need an independent one, prefer using the type-safe variant (see [NewTypedPodGroupInformer]).
func NewPodGroupInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
	return NewPodGroupInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers})
}

// NewTypedPodGroupInformer constructs a new informer for PodGroup type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewTypedPodGroupInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers PodGroupIndexers) PodGroupIndexInformer {
	return NewTypedPodGroupInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.TypedIndexersToIndexers(indexers)})
}

// NewFilteredPodGroupInformer constructs a new informer for PodGroup type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
// If you really need an independent one, prefer using the type-safe variant (see [NewTypedFilteredPodGroupInformer]).
func NewFilteredPodGroupInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
	return NewTypedPodGroupInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: indexers, TweakListOptions: tweakListOptions})
}

// NewTypedFilteredPodGroupInformer constructs a new informer for PodGroup type.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewTypedFilteredPodGroupInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers PodGroupIndexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) PodGroupIndexInformer {
	return NewTypedPodGroupInformerWithOptions(client, namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.TypedIndexersToIndexers(indexers), TweakListOptions: tweakListOptions})
}

// NewPodGroupInformerWithOptions constructs a new informer for PodGroup type with additional options.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
// If you really need an independent one, prefer using the type-safe variant (see [NewTypedPodGroupInformerWithOptions]).
func NewPodGroupInformerWithOptions(client kubernetes.Interface, namespace string, options internalinterfaces.InformerOptions) cache.SharedIndexInformer {
	return NewTypedPodGroupInformerWithOptions(client, namespace, options)
}

// NewTypedPodGroupInformerWithOptions constructs a new informer for PodGroup type with additional options.
// Always prefer using an informer factory to get a shared informer instead of getting an independent
// one. This reduces memory footprint and number of connections to the server.
func NewTypedPodGroupInformerWithOptions(client kubernetes.Interface, namespace string, options internalinterfaces.InformerOptions) PodGroupIndexInformer {
	gvr := schema.GroupVersionResource{Group: "scheduling.k8s.io", Version: "v1beta1", Resource: "podgroups"}
	identifier := options.InformerName.WithResource(gvr)
	tweakListOptions := options.TweakListOptions
	return cache.NewTypedSharedIndexInformer[*apischedulingv1beta1.PodGroup](cache.NewSharedIndexInformerWithOptions(
		cache.ToListWatcherWithWatchListSemantics(&cache.ListWatch{
			ListFunc: func(opts v1.ListOptions) (runtime.Object, error) {
				if tweakListOptions != nil {
					tweakListOptions(&opts)
				}
				return client.SchedulingV1beta1().PodGroups(namespace).List(context.Background(), opts)
			},
			WatchFunc: func(opts v1.ListOptions) (watch.Interface, error) {
				if tweakListOptions != nil {
					tweakListOptions(&opts)
				}
				return client.SchedulingV1beta1().PodGroups(namespace).Watch(context.Background(), opts)
			},
			ListWithContextFunc: func(ctx context.Context, opts v1.ListOptions) (runtime.Object, error) {
				if tweakListOptions != nil {
					tweakListOptions(&opts)
				}
				return client.SchedulingV1beta1().PodGroups(namespace).List(ctx, opts)
			},
			WatchFuncWithContext: func(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
				if tweakListOptions != nil {
					tweakListOptions(&opts)
				}
				return client.SchedulingV1beta1().PodGroups(namespace).Watch(ctx, opts)
			},
		}, client),
		&apischedulingv1beta1.PodGroup{},
		cache.SharedIndexInformerOptions{
			ResyncPeriod: options.ResyncPeriod,
			Indexers:     options.Indexers,
			Identifier:   identifier,
		},
	))
}

func (f *podGroupInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
	return NewTypedPodGroupInformerWithOptions(client, f.namespace, internalinterfaces.InformerOptions{ResyncPeriod: resyncPeriod, Indexers: cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, InformerName: f.factory.InformerName(), TweakListOptions: f.tweakListOptions})
}

func (f *podGroupInformer) Informer() cache.SharedIndexInformer {
	return f.TypedInformer()
}

func (f *podGroupInformer) TypedInformer() PodGroupIndexInformer {
	return cache.NewTypedSharedIndexInformer[*apischedulingv1beta1.PodGroup](f.factory.InformerFor(&apischedulingv1beta1.PodGroup{}, f.defaultInformer))
}

func (f *podGroupInformer) Lister() schedulingv1beta1.PodGroupLister {
	return schedulingv1beta1.NewPodGroupLister(f.Informer().GetIndexer())
}

// ToTypedPodGroupInformer converts an untyped informer into a TypedPodGroupInformer.
//
// WARNING: this conversion is only safe if the informer handles objects of type
// *PodGroup. If that is not the case, calling type-safe methods of the returned
// TypedPodGroupInformer leads to runtime panics. A safer alternative is to pass
// around a TypedPodGroupInformer instances that was obtained from a
// SharedInformerFactory.
func ToTypedPodGroupInformer(informer PodGroupInformer) TypedPodGroupInformer {
	if informer, ok := informer.(TypedPodGroupInformer); ok {
		return informer
	}
	return &podGroupTypedInformerAdapter{informer}
}

type podGroupTypedInformerAdapter struct {
	PodGroupInformer
}

func (a *podGroupTypedInformerAdapter) TypedInformer() PodGroupIndexInformer {
	return cache.NewTypedSharedIndexInformer[*apischedulingv1beta1.PodGroup](a.Informer())
}

// ToPodGroupIndexInformer converts an untyped informer into a PodGroupIndexInformer.
//
// WARNING: this conversion is only safe if the informer handles objects of type
// *PodGroup. If that is not the case, calling type-safe methods of the returned
// PodGroupIndexInformer leads to runtime panics. A safer alternative is to pass
// around a PodGroupIndexInformer instances that was obtained from a
// SharedInformerFactory.
func ToPodGroupIndexInformer(informer cache.SharedIndexInformer) PodGroupIndexInformer {
	if informer, ok := informer.(PodGroupIndexInformer); ok {
		return informer
	}
	return cache.NewTypedSharedIndexInformer[*apischedulingv1beta1.PodGroup](informer)
}
