2021-05-14 16:58:27 +02:00
|
|
|
package formulae
|
|
|
|
|
|
|
|
// NOTE: GoLang hat noch keine generics. Erst 2022.
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate int-value FN from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeIntValued(scheme func(fml Formula, prevValues []int) int) func(fml Formula) int {
|
|
|
|
var fn func(fml Formula) int
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan int, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) int {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan int), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([]int, len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan int) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate string-value FN from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeStringValued(scheme func(fml Formula, prevValues []string) string) func(fml Formula) string {
|
|
|
|
var fn func(fml Formula) string
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan string, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) string {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan string), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([]string, len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan string) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate *[]string-value Fn from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeStringsValued(scheme func(fml Formula, prevValues [][]string) []string) func(fml Formula) []string {
|
|
|
|
var fn func(fml Formula) []string
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan []string, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) []string {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan []string), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([][]string, len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan []string) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate Formula-value Fn from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeFmlValued(scheme func(fml Formula, prevValues []Formula) Formula) func(fml Formula) Formula {
|
|
|
|
var fn func(fml Formula) Formula
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan Formula, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) Formula {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan Formula), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([]Formula, len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan Formula) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate *[]Formula-value Fn from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeFmlsValued(scheme func(fml Formula, prevValues [](*[]Formula)) *[]Formula) func(fml Formula) *[]Formula {
|
|
|
|
var fn func(fml Formula) *[]Formula
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan *[]Formula, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) *[]Formula {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan *[]Formula), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([](*[]Formula), len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan *[]Formula) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
|
|
* Generate {pos: Formula, ne: Formula}-value Fn from scheme
|
|
|
|
* ---------------------------------------------------------------- */
|
|
|
|
|
|
|
|
func CreateFromSchemeFmlPairValued(scheme func(fml Formula, prevValues []FormulaPair) FormulaPair) func(fml Formula) FormulaPair {
|
|
|
|
var fn func(fml Formula) FormulaPair
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFn = func(ch chan FormulaPair, subFml Formula) { ch <- fn(subFml) }
|
2021-05-14 16:58:27 +02:00
|
|
|
fn = func(fml Formula) FormulaPair {
|
2021-05-18 11:31:29 +02:00
|
|
|
var subFmls = fml.GetSubFormulae()
|
|
|
|
var n = len(subFmls)
|
2021-05-14 16:58:27 +02:00
|
|
|
var subChan = make([](chan FormulaPair), n)
|
2021-05-18 11:31:29 +02:00
|
|
|
var prevValues = make([]FormulaPair, len(subFmls))
|
2021-05-14 16:58:27 +02:00
|
|
|
// start parallel computations on subformulas
|
2021-05-18 11:31:29 +02:00
|
|
|
for i, subFml := range subFmls {
|
2021-05-14 16:58:27 +02:00
|
|
|
subChan[i] = make(chan FormulaPair) // create Channel, since currently nil
|
2021-05-18 11:31:29 +02:00
|
|
|
go subFn(subChan[i], subFml)
|
2021-05-14 16:58:27 +02:00
|
|
|
}
|
|
|
|
// successively read values
|
|
|
|
for i := 0; i < n; i++ {
|
|
|
|
prevValues[i] = <-subChan[i]
|
|
|
|
}
|
|
|
|
// apply schema to get value for formula
|
|
|
|
return scheme(fml, prevValues)
|
|
|
|
}
|
|
|
|
return fn
|
|
|
|
}
|