import Foundation import RealModule public struct RRSeries { public let timeParameters: TimeParameters public let rrParamaters: RRParameters let rng: RandomNumberGenerator struct Segment { let end: T let value: T } let segments: [Segment] let count: Int public init(timeParameters: TimeParameters, rrParamaters: RRParameters, rng: RandomNumberGenerator, signal: [T]) { self.timeParameters = timeParameters self.rrParamaters = rrParamaters self.rng = rng let sr = T(timeParameters.srInternal) var rrn = [Segment]() // generate piecewise RR time series do { var tecg = T.zero var i = 0 while i < signal.count { tecg += signal[i] rrn.append(Segment(end: tecg, value: signal[i])) i = Int((tecg * sr).rounded(.toNearestOrEven)) + 1 } } segments = rrn count = signal.count } public func valueAt(_ t: T) -> T { let index = min(segments.partitioningIndex { t < $0.end }, segments.endIndex - 1) return segments[index].value } }