Skip to content

Commit cea2295

Browse files
committed
update to Julia 1
1 parent 7cca6c7 commit cea2295

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

src/Primes.jl

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module Primes
44

55
using Base.Iterators: repeated
66

7-
import Base: start, next, done, eltype, iteratorsize, iteratoreltype
7+
import Base: iterate, eltype, IteratorSize, IteratorEltype
88
using Base: BitSigned
99
using Base.Checked: checked_neg
1010

@@ -675,36 +675,38 @@ struct NextPrimes{T<:Integer}
675675
start::T
676676
end
677677

678-
Base.start(np::NextPrimes) = np.start < 2 ? np.start : add(np.start, -1)
679-
Base.next(np::NextPrimes, state) = (p = nextprime(add(state, 1)); (p, p))
680-
Base.done(np::NextPrimes, state) = false
678+
function iterate(np::NextPrimes,
679+
state = p = np.start < 2 ? np.start : add(np.start, -1)
680+
)
681+
p = nextprime(add(state, 1))
682+
(p, p)
683+
end
681684

682-
Base.iteratorsize(::Type{<:NextPrimes}) = Base.IsInfinite()
683-
Base.iteratoreltype(::Type{<:NextPrimes}) = Base.HasEltype() # default
685+
IteratorSize(::Type{<:NextPrimes}) = Base.IsInfinite()
686+
IteratorEltype(::Type{<:NextPrimes}) = Base.HasEltype()
684687

685-
Base.eltype(::Type{NextPrimes{T}}) where {T} = T
688+
eltype(::Type{NextPrimes{T}}) where {T} = T
686689

687690
"""
688691
nextprimes(start::Integer)
689692
690-
Returns an iterator over all primes greater than or equal to `start`,
693+
Return an iterator over all primes greater than or equal to `start`,
691694
in ascending order.
692695
"""
693696
nextprimes(start::Integer) = NextPrimes(start)
694697

695698
"""
696699
nextprimes(T::Type=Int)
697700
698-
Returns an iterator over all primes, with type `T`.
701+
Return an iterator over all primes, with type `T`.
699702
Equivalent to `nextprimes(T(1))`.
700703
"""
701-
nextprimes(::Type{T}) where {T<:Integer} = nextprimes(one(T))
702-
nextprimes() = nextprimes(Int)
704+
nextprimes(::Type{T}=Int) where {T<:Integer} = nextprimes(one(T))
703705

704706
"""
705707
nextprimes(start::Integer, n::Integer)
706708
707-
Returns an array of the first `n` primes greater than or equal to `start`.
709+
Return an array of the first `n` primes greater than or equal to `start`.
708710
709711
# Example
710712
@@ -716,25 +718,34 @@ julia> nextprimes(10, 3)
716718
17
717719
```
718720
"""
719-
nextprimes(start::T, n::Integer) where {T<:Integer} = collect(T, take(nextprimes(start), n))
721+
nextprimes(start::T, n::Integer) where {T<:Integer} =
722+
collect(T, Iterators.take(nextprimes(start), n))
720723

721724
struct PrevPrimes{T<:Integer}
722725
start::T
723726
end
724727

725-
start(np::PrevPrimes) = np.start+one(np.start) # allow wrap-around
726-
next(np::PrevPrimes, state) = (p = prevprime(state-one(state)); (p, p))
727-
done(np::PrevPrimes, state) = state == 2
728+
function iterate(np::PrevPrimes,
729+
state = np.start+one(np.start) # allow wrap-around
730+
)
731+
c = state-one(state)
732+
if isone(c)
733+
nothing
734+
else
735+
p = prevprime(c)
736+
(p, p)
737+
end
738+
end
728739

729-
iteratorsize(::Type{<:PrevPrimes}) = Base.SizeUnknown()
730-
iteratoreltype(::Type{<:PrevPrimes}) = Base.HasEltype() # default
740+
IteratorSize(::Type{<:PrevPrimes}) = Base.SizeUnknown()
741+
Iteratoreltype(::Type{<:PrevPrimes}) = Base.HasEltype()
731742

732743
eltype(::Type{PrevPrimes{T}}) where {T} = T
733744

734745
"""
735746
prevprimes(start::Integer)
736747
737-
Returns an iterator over all primes less than or equal to `start`,
748+
Return an iterator over all primes less than or equal to `start`,
738749
in descending order.
739750
740751
# Example
@@ -753,8 +764,9 @@ prevprimes(start::Integer) = PrevPrimes(max(one(start), start))
753764
"""
754765
prevprimes(start::Integer, n::Integer)
755766
756-
Returns an array of the first `n` primes less than or equal to `start`,
757-
in descending order.
767+
Return an array of the first `n` primes less than or equal to `start`,
768+
in descending order. When there are less than `n` primes less than or
769+
equal to `start`, those primes are returned without an error.
758770
759771
# Example
760772
@@ -764,8 +776,16 @@ julia> prevprimes(10, 3)
764776
7
765777
5
766778
3
779+
780+
julia> prevprimes(10, 10)
781+
3-element Array{Int64,1}:
782+
7
783+
5
784+
3
785+
2
767786
```
768787
"""
769-
prevprimes(start::T, n::Integer) where {T<:Integer} = collect(T, take(prevprimes(start, n)))
788+
prevprimes(start::T, n::Integer) where {T<:Integer} =
789+
collect(T, Iterators.take(prevprimes(start), n))
770790

771791
end # module

test/runtests.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,6 @@ end
417417
@test prevprimes(6, 1)[1] == prevprimes(5, 1)[1] == 5
418418
@test prevprimes(4, 1)[1] == prevprimes(3, 1)[1] == 3
419419
@test prevprimes(2, 1)[1] == 2
420-
@test_throws ArgumentError prevprimes(2, 2)
421420
let p8 = collect(prevprimes(typemax(Int8)))
422421
@test length(p8) == 31
423422
@test p8[end] == 2

0 commit comments

Comments
 (0)