func MethodChainStructForReversePtr() string {
	return `
func (slice <NEWTYPE>SlicePtr) ReversePtr() <NEWTYPE>SlicePtr {
	return Reverse<CONDITIONAL_TYPE>sPtr(slice)
}
`
}
MethodChainStructForReversePtr is template to generate functional code for different combination of data type
package methodchain
func MethodChainBasic() string {
	return `
type <NEWTYPE>Slice []<TYPE>
type <NEWTYPE>FunctorForMap func(<TYPE>) <TYPE>
type <NEWTYPE>FunctorForFilter func(<TYPE>) bool
type <NEWTYPE>SlicePtr []*<TYPE>
type <NEWTYPE>FunctorForMapPtr func(*<TYPE>) *<TYPE>
type <NEWTYPE>FunctorForFilterPtr func(*<TYPE>) bool
func Make<FTYPE>Slice(values ...<TYPE>) <NEWTYPE>Slice {
	newSlice := <NEWTYPE>Slice(values)
	return newSlice
}
func (slice <NEWTYPE>Slice) Map(functors ...<NEWTYPE>FunctorForMap) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Map<FTYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func Make<FTYPE>SlicePtr(values ...*<TYPE>) <NEWTYPE>SlicePtr {
	newSlice := <NEWTYPE>SlicePtr(values)
	return newSlice
}
func (slice <NEWTYPE>SlicePtr) MapPtr(functors ...<NEWTYPE>FunctorForMapPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Map<FTYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>Slice) Filter(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Filter<FTYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>SlicePtr) FilterPtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Filter<FTYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>Slice) Remove(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Remove<FTYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>SlicePtr) RemovePtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Remove<FTYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>Slice) DropWhile(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = DropWhile<FTYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>SlicePtr) DropWhilePtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = DropWhile<FTYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>Slice) Reverse() <NEWTYPE>Slice {
	return Reverse<FTYPE>s(slice)
}
func (slice <NEWTYPE>SlicePtr) ReversePtr() <NEWTYPE>SlicePtr {
	return Reverse<FTYPE>sPtr(slice)
}
func (slice <NEWTYPE>Slice) Distinct() <NEWTYPE>Slice {
	return Distinct<FTYPE>(slice)
}
func (slice <NEWTYPE>SlicePtr) DistinctPtr() <NEWTYPE>SlicePtr {
	return Distinct<FTYPE>Ptr(slice)
}
func (slice <NEWTYPE>Slice) TakeWhile(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = TakeWhile<FTYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>SlicePtr) TakeWhilePtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = TakeWhile<FTYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainBasicSort() string {
	return `
func (slice <NEWTYPE>Slice) Sort() <NEWTYPE>Slice {
	return Sort<FTYPE>s(slice)
}
func (slice <NEWTYPE>Slice) SortDesc() <NEWTYPE>Slice {
	return Sort<FTYPE>sDesc(slice)
}
func (slice <NEWTYPE>SlicePtr) SortPtr() <NEWTYPE>SlicePtr {
	return Sort<FTYPE>sPtr(slice)
}
func (slice <NEWTYPE>SlicePtr) SortDescPtr() <NEWTYPE>SlicePtr {
	return Sort<FTYPE>sDescPtr(slice)
}
`
}
func MethodChainStruct() string {
	return `
type <NEWTYPE>Slice []<TYPE>
type <NEWTYPE>FunctorForMap func(<TYPE>) <TYPE>
type <NEWTYPE>FunctorForFilter func(<TYPE>) bool
type <NEWTYPE>SlicePtr []*<TYPE>
type <NEWTYPE>FunctorForMapPtr func(*<TYPE>) *<TYPE>
type <NEWTYPE>FunctorForFilterPtr func(*<TYPE>) bool
func Make<FTYPE>Slice(values ...<TYPE>) <NEWTYPE>Slice {
	newSlice := <NEWTYPE>Slice(values)
	return newSlice
}
func (slice <NEWTYPE>Slice) Map(functors ...<NEWTYPE>FunctorForMap) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Map<CONDITIONAL_TYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func Make<FTYPE>SlicePtr(values ...*<TYPE>) <NEWTYPE>SlicePtr {
	newSlice := <NEWTYPE>SlicePtr(values)
	return newSlice
}
func (slice <NEWTYPE>SlicePtr) MapPtr(functors ...<NEWTYPE>FunctorForMapPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Map<CONDITIONAL_TYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>Slice) Filter(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Filter<CONDITIONAL_TYPE>(f, tmpSlice)
	}
	return tmpSlice
}
func (slice <NEWTYPE>SlicePtr) FilterPtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Filter<CONDITIONAL_TYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainStructForRemove() string {
	return `
func (slice <NEWTYPE>Slice) Remove(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Remove<CONDITIONAL_TYPE>(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainStructForRemovePtr() string {
	return `
func (slice <NEWTYPE>SlicePtr) RemovePtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = Remove<CONDITIONAL_TYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainStructForDropWhile() string {
	return `
func (slice <NEWTYPE>Slice) DropWhile(functors ...<NEWTYPE>FunctorForFilter) <NEWTYPE>Slice {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = DropWhile<CONDITIONAL_TYPE>(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainStructForDropWhilePtr() string {
	return `
func (slice <NEWTYPE>SlicePtr) DropWhilePtr(functors ...<NEWTYPE>FunctorForFilterPtr) <NEWTYPE>SlicePtr {
	tmpSlice := slice
	for _, f := range functors {
		if f == nil {
			continue
		}
		tmpSlice = DropWhile<CONDITIONAL_TYPE>Ptr(f, tmpSlice)
	}
	return tmpSlice
}
`
}
func MethodChainStructForReverse() string {
	return `
func (slice <NEWTYPE>Slice) Reverse() <NEWTYPE>Slice {
	return Reverse<CONDITIONAL_TYPE>s(slice)
}
`
}