vim9script # Vim9 generic functions # VIM_TEST_SETUP let g:vimsyn_folding = "cf" # VIM_TEST_SETUP setl fdc=2 fdl=99 fdm=syntax # VIM_TEST_SETUP hi link vim9DefTypeParam Todo # :help generic-functions def MyFunc(param1: T): T var f: A var x = param1 return x enddef MyFunc>() def Flatten(x: list>): list var result: list = [] for inner in x result += inner endfor return result enddef echo Flatten([[1, 2], [3]]) class A def Foo() enddef endclass var a = A.new() a.Foo() def MakeEcho(): func(T): T return (x: T): T => x enddef var EchoNumber = MakeEcho() echo EchoNumber(123) var EchoString = MakeEcho() echo EchoString('abc') # FIXME: add specific command handling # defcompile MyFunc, dict> # disassemble MyFunc> # disassemble MyFunc> # funcrefs var Foo = Bar Execute(Bar) var Foo = bar.Baz Execute(bar.Baz) class Foo def _MethodA(arg: T) echo arg enddef def MethodB() var F = this._MethodA F("text") enddef endclass class Bar extends Foo def MethodC() var F = super._MethodA F("text") enddef endclass # Issue: https://github.com/vim/vim/pull/17722#issuecomment-3075531052 export def Id(): func(U): U return (X_: U) => X_ enddef export def Const(): func(U): func(V): U return (X_: U) => (_: V) => X_ enddef export def Flip(): func(func(U): func(V): W): func(V): func(U): W return (F_: func(U): func(V): W) => (Y_: V) => (X_: U) => F_(X_)(Y_) enddef echo Const()(2)(null) == Flip()(Const())(null)(2)