function compute(t::AbstractTask; data...) return error("Need to implement compute()") end function compute_effort(t::AbstractTask) # default implementation using compute return error("Need to implement compute_effort()") end function data(t::AbstractTask) return error("Need to implement data()") end compute_effort(t::AbstractDataTask) = 0 compute(t::AbstractDataTask; data...) = data data(t::AbstractDataTask) = getfield(t, :data) data(t::AbstractComputeTask) = 0 function compute_effort(t::FusedComputeTask) (T1, T2) = collect(typeof(t).parameters) return compute_effort(T1()) + compute_effort(T2()) end # actual compute functions for the tasks can stay undefined for now # compute(t::ComputeTaskU, data::Any) = mycomputation(data) function compute_intensity(t::AbstractTask)::UInt64 if data(t) == 0 return typemax(UInt64) end return compute_effort(t) / data(t) end