# collect(Iterators.take(itr, 10)) returns a Vector of Any (instead of Vector of Date or DateTime)

**URL:** <https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373>\
**Category:** General Usage\
**Tags:** question, dates\
**Created:** [November 28, 2017, 9:05pm UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373 "2017-11-28T21:05:41Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![scelles](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scelles/32/220408_2.png) [@scelles](https://discourse.julialang.org/u/scelles)\
**Post date:** [November 28, 2017, 9:05pm UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373/1 "2017-11-28T21:05:41Z")

</div>

Hello,

I’m working on adjuster functions [https://docs.julialang.org/en/stable/manual/dates/#Adjuster-Functions-1](https://docs.julialang.org/en/stable/manual/dates/#Adjuster-Functions-1)  
and would like to build an iterator of Date (or DateTime) respecting some date adjusting rules.

Here is my code

```julia
import Base: start, done, next
import Base: iteratorsize, IsInfinite

struct DateIterator
    func::Function
    dt::Dates.TimeType
end
start(itr::DateIterator) = itr.dt
done(itr::DateIterator, state) = false
function next(itr::DateIterator, state)
    state = Dates.tonext(itr.func, state)
    state, state
end
iteratorsize(::Type{DateIterator}) = IsInfinite()
#eltype(it::DateIterator) = typeof(it.dt)

dt = Date(2014,7,13)
istuesday = x->Dates.dayofweek(x) == Dates.Tuesday
itr = DateIterator(istuesday, dt)

#state = start(itr)
#while !done(itr, state)
# dt, state = next(itr, state)
# println(dt)
#end

#for (i, dt) in enumerate(itr)
# println(dt)
# if i == 10
# break
# end
#end

println(collect(Iterators.take(itr, 10)))

```

My issue is that I get a vector of Any.

```julia
Any[2014-07-15, 2014-07-22, 2014-07-29, 2014-08-05, 2014-08-12, 2014-08-19, 2014-08-26, 2014-09-02, 2014-09-09, 2014-09-16]

```

How to have a vector of Date (or DateTime)?

Kind regards

---

<div class="post-metadata">

**Author:** ![bicycle1885](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bicycle1885/32/107_2.png) [@bicycle1885](https://discourse.julialang.org/u/bicycle1885)\
**Post date:** [November 28, 2017, 11:57pm UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373/2 "2017-11-28T23:57:57Z")

</div>

The element type is not inferable because the types of fields of the `DateIterator` type are abstract.  
In this case, I think you can use parameterized type definition:

```julia
struct DateIterator{F<:Function,T<:Dates.TimeType}
    func::F
    dt::T
end  

```

---

<div class="post-metadata">

**Author:** ![scelles](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scelles/32/220408_2.png) [@scelles](https://discourse.julialang.org/u/scelles)\
**Post date:** [November 29, 2017, 6:53am UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373/3 "2017-11-29T06:53:46Z")

</div>

Thanks @bicycle1885 but it doesn’t help  
Here is my code:

```julia
import Base: start, done, next
import Base: iteratorsize, IsInfinite

struct DateIterator{F<:Function,T<:Dates.TimeType}
    func::F
    dt::T
end  
start(itr::DateIterator) = itr.dt
done(itr::DateIterator, state) = false
function next(itr::DateIterator, state)
    state = Dates.tonext(itr.func, state)
    state, state
end
iteratorsize{T<:DateIterator}(::Type{T}) = IsInfinite()

dt = Date(2014,7,13)
istuesday = x->Dates.dayofweek(x) == Dates.Tuesday
itr = DateIterator(istuesday, dt)

println(collect(Iterators.take(itr, 10)))

```

---

<div class="post-metadata">

**Author:** ![bicycle1885](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bicycle1885/32/107_2.png) [@bicycle1885](https://discourse.julialang.org/u/bicycle1885)\
**Post date:** [November 29, 2017, 8:46am UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373/4 "2017-11-29T08:46:51Z")

</div>

> [@scelles](#):
>
> println(collect(Iterators.take(itr, 10)))

Oh, sorry. I replied before checking the result.

Adding a line `Base.eltype(::Type{DateIterator{F,T}}) where {F,T} = T` to the next of the `iteratorsize` definition will make it work:

```julia-auto
import Base: start, done, next
import Base: iteratorsize, IsInfinite

struct DateIterator{F<:Function,T<:Dates.TimeType}
    func::F
    dt::T
end  
start(itr::DateIterator) = itr.dt
done(itr::DateIterator, state) = false
function next(itr::DateIterator, state)
    state = Dates.tonext(itr.func, state)
    state, state
end
iteratorsize{T<:DateIterator}(::Type{T}) = IsInfinite()
Base.eltype(::Type{DateIterator{F,T}}) where {F,T} = T

dt = Date(2014,7,13)
istuesday = x->Dates.dayofweek(x) == Dates.Tuesday
itr = DateIterator(istuesday, dt)

println(collect(Iterators.take(itr, 10)))

```

output:

```julia-auto
Date[2014-07-15, 2014-07-22, 2014-07-29, 2014-08-05, 2014-08-12, 2014-08-19, 2014-08-26, 2014-09-02, 2014-09-09, 2014-09-16]

```

---

<div class="post-metadata">

**Author:** ![scelles](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/scelles/32/220408_2.png) [@scelles](https://discourse.julialang.org/u/scelles)\
**Post date:** [November 29, 2017, 10:49am UTC](https://discourse.julialang.org/t/collect-iterators-take-itr-10-returns-a-vector-of-any-instead-of-vector-of-date-or-datetime/7373/5 "2017-11-29T10:49:00Z")

</div>

Thanks @bicycle1885 you fixed my issue!
