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