fmt.Fprintf(f,"of%d takes a function with %d parameters and returns a new function with %d parameters that will bind these parameters to the positions [",total,total,len(c))
fori,idx:=rangec{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"] of the original function.\n// The return value of is a function with the remaining %d parameters at positions [",len(rem))
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"] of the original function.\n")
fmt.Fprintf(f,"func Bind")
for_,idx:=rangec{
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"of%d[F ~func(",total)
fori:=0;i<total;i++{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",i+1)
}
fmt.Fprintf(f,") R")
fori:=0;i<total;i++{
fmt.Fprintf(f,", T%d",i+1)
}
fmt.Fprintf(f,", R any](f F) func(")
fori,idx:=rangec{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",idx)
}
fmt.Fprintf(f,") func(")
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",idx)
}
fmt.Fprintf(f,") R {\n")
fmt.Fprintf(f," return func(")
fori,idx:=rangec{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d T%d",idx,idx)
}
fmt.Fprintf(f,") func(")
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",idx)
}
fmt.Fprintf(f,") R {\n")
fmt.Fprintf(f," return func(")
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d T%d",idx,idx)
}
fmt.Fprintf(f,") R {\n")
fmt.Fprintf(f," return f(")
fori:=1;i<=total;i++{
ifi>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d",i)
}
fmt.Fprintf(f,")\n")
fmt.Fprintf(f," }\n")
fmt.Fprintf(f," }\n")
fmt.Fprintf(f,"}\n")
// ignore function
fmt.Fprintf(f,"\n// Ignore")
for_,idx:=rangec{
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"of%d takes a function with %d parameters and returns a new function with %d parameters that will ignore the values at positions [",total,len(rem),total)
fori,idx:=rangec{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"] and pass the remaining %d parameters to the original function\n",len(rem))
fmt.Fprintf(f,"func Ignore")
for_,idx:=rangec{
fmt.Fprintf(f,"%d",idx)
}
fmt.Fprintf(f,"of%d[",total)
// start with the undefined parameters
fori,idx:=rangec{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",idx)
}
iflen(c)>0{
fmt.Fprintf(f," any, ")
}
fmt.Fprintf(f,"F ~func(")
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",idx)
}
fmt.Fprintf(f,") R")
for_,idx:=rangerem{
fmt.Fprintf(f,", T%d",idx)
}
fmt.Fprintf(f,", R any](f F) func(")
fori:=0;i<total;i++{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",i+1)
}
fmt.Fprintf(f,") R {\n")
fmt.Fprintf(f," return func(")
fori:=0;i<total;i++{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d T%d",i+1,i+1)
}
fmt.Fprintf(f,") R {\n")
fmt.Fprintf(f," return f(")
fori,idx:=rangerem{
ifi>0{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d",idx)
}
fmt.Fprintf(f,")\n")
fmt.Fprintf(f," }\n")
fmt.Fprintf(f,"}\n")
}
}
funcgenerateSingleBind(f*os.File,totalint){
fmt.Fprintf(f,"// Combinations for a total of %d arguments\n",total)