package lfu type GetValueSizeFunc[V any] func(value V) (int, error) type Options[K comparable, V any] struct { GetValueSize GetValueSizeFunc[V] Capacity int } type OptionsFunc[K comparable, V any] func(opts *Options[K, V]) func DefaultOptions[K comparable, V any](funcs ...OptionsFunc[K, V]) *Options[K, V] { opts := &Options[K, V]{ GetValueSize: DefaultGetValueSize[V], Capacity: 100, } for _, fn := range funcs { fn(opts) } return opts } func WithCapacity[K comparable, V any](capacity int) OptionsFunc[K, V] { return func(opts *Options[K, V]) { opts.Capacity = capacity } } func WithGetValueSize[K comparable, V any](getValueSize GetValueSizeFunc[V]) OptionsFunc[K, V] { return func(opts *Options[K, V]) { opts.GetValueSize = getValueSize } }