From b6a843b32f3d2b45e42b3e583c4bdb0e73c6a641 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar <michiel.cottaar@ndcn.ox.ac.uk> Date: Thu, 15 Feb 2024 15:20:13 +0000 Subject: [PATCH] Only iterate once over infinitely repeating sequence --- src/all_sequences/base_sequences.jl | 4 ++-- src/all_sequences/sequences.jl | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/all_sequences/base_sequences.jl b/src/all_sequences/base_sequences.jl index e610e7b..db04689 100644 --- a/src/all_sequences/base_sequences.jl +++ b/src/all_sequences/base_sequences.jl @@ -21,7 +21,7 @@ Sub-types need to implement: abstract type BaseSequence{N} <: ContainerBlock end function Base.getindex(bs::BaseSequence{N}, index::Integer) where {N} - if index < 1 || index > length(bs) + if nrepeat(bs) > 0 && (index < 1 || index > length(bs)) throw(BoundsError(bs, index)) end base_index = ((index - 1) % N) + 1 @@ -29,7 +29,7 @@ function Base.getindex(bs::BaseSequence{N}, index::Integer) where {N} end Base.iterate(bs::BaseSequence) = Base.iterate(bs, 1) Base.iterate(bs::BaseSequence{N}, index::Integer) where {N} = index > length(bs) ? nothing : (bs[index], index + 1) -Base.length(bs::BaseSequence{N}) where {N} = nrepeat(bs) * N +Base.length(bs::BaseSequence{N}) where {N} = iszero(nrepeat(bs)) ? N : (nrepeat(bs) * N) Base.eltype(::Type{<:BaseSequence}) = ContainerBlock function start_time(bs::BaseSequence{N}, index::Integer) where {N} diff --git a/src/all_sequences/sequences.jl b/src/all_sequences/sequences.jl index af67159..99f759f 100644 --- a/src/all_sequences/sequences.jl +++ b/src/all_sequences/sequences.jl @@ -20,10 +20,9 @@ Defines an MRI sequence from a vector of building blocks. struct Sequence{N} <: BaseSequence{N} blocks :: SVector{N, <:ContainerBlock} TR :: VariableType - nrepeat :: Int end -function Sequence(blocks::AbstractVector; TR=:min, nrepeat=0) +function Sequence(blocks::AbstractVector; TR=:min) if TR == :min TR = sum(duration, blocks; init=0.) end @@ -36,8 +35,7 @@ end Sequence(blocks...; kwargs...) = Sequence([blocks...]; kwargs...) get_index_single_TR(s::Sequence, i::Integer) = s.blocks[i] -Base.IteratorSize(::Type{<:Sequence}) = Base.IsInfinite() -nrepeat(::Sequence) = Inf +nrepeat(::Sequence) = 0 """ to_block(block_like) -- GitLab