fmt.Fprintf(f,"\n// Monoid%d creates a [Monoid] for a [Tuple%d] based on %d monoids for the contained types\n",i,i,i)
fmt.Fprintf(f,"func Monoid%d[",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",j)
}
fmt.Fprintf(f," any](")
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"m%d M.Monoid[T%d]",j,j)
}
fmt.Fprintf(f,") M.Monoid[")
writeTupleType(f,i)
fmt.Fprintf(f,"] {\n")
fmt.Fprintf(f," return M.MakeMonoid(func(l, r ")
writeTupleType(f,i)
fmt.Fprintf(f,") ")
writeTupleType(f,i)
fmt.Fprintf(f,"{\n")
fmt.Fprintf(f," return MakeTuple%d(",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"m%d.Concat(l.F%d, r.F%d)",j,j,j)
}
fmt.Fprintf(f,")\n")
fmt.Fprintf(f," }, MakeTuple%d(",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"m%d.Empty()",j)
}
fmt.Fprintf(f,"))\n")
fmt.Fprintf(f,"}\n")
}
funcgenerateOrd(f*os.File,iint){
// Create the optionize version
fmt.Fprintf(f,"\n// Ord%d creates n [Ord] for a [Tuple%d] based on %d [Ord]s for the contained types\n",i,i,i)
fmt.Fprintf(f,"func Ord%d[",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",j)
}
fmt.Fprintf(f," any](")
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"o%d O.Ord[T%d]",j,j)
}
fmt.Fprintf(f,") O.Ord[")
writeTupleType(f,i)
fmt.Fprintf(f,"] {\n")
fmt.Fprintf(f," return O.MakeOrd(func(l, r ")
writeTupleType(f,i)
fmt.Fprintf(f,") int {\n")
forj:=1;j<=i;j++{
fmt.Fprintf(f," if c:= o%d.Compare(l.F%d, r.F%d); c != 0 {return c}\n",j,j,j)
}
fmt.Fprintf(f," return 0\n")
fmt.Fprintf(f," }, func(l, r ")
writeTupleType(f,i)
fmt.Fprintf(f,") bool {\n")
fmt.Fprintf(f," return ")
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f," && ")
}
fmt.Fprintf(f,"o%d.Equals(l.F%d, r.F%d)",j,j,j)
}
fmt.Fprintf(f,"\n")
fmt.Fprintf(f," })\n")
fmt.Fprintf(f,"}\n")
}
funcgenerateTupleType(f*os.File,iint){
// Create the optionize version
fmt.Fprintf(f,"\n// Tuple%d is a struct that carries %d independently typed values\n",i,i)
fmt.Fprintf(f,"type Tuple%d[",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",j)
}
fmt.Fprintf(f," any] struct {\n")
forj:=1;j<=i;j++{
fmt.Fprintf(f," F%d T%d\n",j,j)
}
fmt.Fprintf(f,"}\n")
}
funcgenerateMakeTupleType(f*os.File,iint){
// Create the optionize version
fmt.Fprintf(f,"\n// MakeTuple%d is a function that converts its %d parameters into a [Tuple%d]\n",i,i,i)
fmt.Fprintf(f,"func MakeTuple%d[",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",j)
}
fmt.Fprintf(f," any](")
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d T%d",j,j)
}
fmt.Fprintf(f,") ")
writeTupleType(f,i)
fmt.Fprintf(f," {\n")
fmt.Fprintf(f," return Tuple%d[",i)
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"T%d",j)
}
fmt.Fprintf(f,"]{")
forj:=1;j<=i;j++{
ifj>1{
fmt.Fprintf(f,", ")
}
fmt.Fprintf(f,"t%d",j)
}
fmt.Fprintf(f,"}\n")
fmt.Fprintf(f,"}\n")
}
funcgenerateUntupled(f*os.File,iint){
// Create the optionize version
fmt.Fprintf(f,"\n// Untupled%d converts a function with a [Tuple%d] parameter into a function with %d parameters\n// The inverse function is [Tupled%d]\n",i,i,i,i)
fmt.Fprintf(f,"\n// Tupled%d converts a function with %d parameters returning into a function taking a Tuple%d\n// The inverse function is [Untupled%d]\n",i,i,i,i)