First functional version of a blackboard and a blackboard based obicount

This commit is contained in:
Eric Coissac
2024-07-31 23:16:45 +02:00
parent dfe2fc3d43
commit f36b39bfa3
40 changed files with 1236 additions and 257 deletions

View File

@ -0,0 +1,70 @@
package obiblackboard
import "git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils"
type Iteration[T any] struct {
Index int
Value T
}
// DoIterateSlice generates a DoTask function that iterates over a given slice and
// creates a new InitialTask for each element. The function takes in a slice of type
// T and a target string. It returns a DoTask function that can be used to execute
// the iteration. The DoTask function takes a Blackboard and a Task as input and
// returns a new Task. The Task's Role is set to the target string and its Body is
// set to an Iteration struct containing the index i and the element s[i] from the
// input slice. The iteration stops when the index i is equal to or greater than
// the length of the input slice.
//
// Parameters:
// - s: The slice of type T to iterate over.
// - target: The target string to set as the Task's Role.
//
// Return type:
// - DoTask: The DoTask function that can be used to execute the iteration.
func DoIterateSlice[T any](s []T, target string) DoTask {
n := len(s)
idx := obiutils.AtomicCounter()
dt := func(bb *Blackboard, t *Task) *Task {
i := idx()
if i < n {
nt := t.GetNext(target, false, false)
nt.Body = Iteration[T]{i, s[i]}
return nt
}
return nil
}
return dt
}
// DoCount generates a DoTask function that iterates over a given integer n and
// creates a new InitialTask for each iteration. The function takes in an integer n
// and a target string. It returns a DoTask function that can be used to execute
// the iteration. The DoTask function takes a Blackboard and a Task as input and
// returns a new Task. The Task's Role is set to the target string and its Body is
// set to the current iteration index i. The iteration stops when the index i is
// equal to or greater than the input integer n.
//
// Parameters:
// - n: The integer to iterate over.
// - target: The target string to set as the Task's Role.
//
// Return type:
// - DoTask: The DoTask function that can be used to execute the iteration.
func DoCount(n int, target string) DoTask {
idx := obiutils.AtomicCounter()
dt := func(bb *Blackboard, t *Task) *Task {
i := idx()
if i < n {
nt := t.GetNext(target, false, false)
nt.Body = i
return nt
}
return nil
}
return dt
}