github.com/kazu/loncha@v0.6.3/opt.go (about)

     1  package loncha
     2  
     3  type opParam[T any] struct {
     4  	Param T
     5  }
     6  
     7  // Opt ... functional options of lonch operator
     8  type Opt[T any] func(*opParam[T]) Opt[T]
     9  
    10  func (p *opParam[T]) Options(opts ...Opt[T]) (prevs []Opt[T]) {
    11  
    12  	for _, opt := range opts {
    13  		prevs = append(prevs, opt(p))
    14  	}
    15  	return
    16  }
    17  
    18  // DefauiltOpt ... default function option
    19  func DefauiltOpt[T any]() *opParam[T] {
    20  	return &opParam[T]{}
    21  }
    22  
    23  // MergeOpts ... using innner in function with Opt[T]
    24  //               this run DefaultOpt() and Options() .
    25  func MergeOpts[T any](opts ...Opt[T]) (*opParam[T], func(p *opParam[T])) {
    26  
    27  	param := DefauiltOpt[T]()
    28  	prevs := param.Options(opts...)
    29  
    30  	return param, func(p *opParam[T]) {
    31  		p.Options(prevs...)
    32  	}
    33  }