|
1 | 1 |
|
2 | 2 | abstract type AbstractThunk <: AbstractDifferential end |
3 | 3 |
|
4 | | -Base.Broadcast.broadcastable(x::AbstractThunk) = broadcastable(extern(x)) |
| 4 | +Base.Broadcast.broadcastable(x::AbstractThunk) = broadcastable(unthunk(x)) |
5 | 5 |
|
6 | 6 | @inline function Base.iterate(x::AbstractThunk) |
7 | | - externed = extern(x) |
8 | | - element, state = iterate(externed) |
9 | | - return element, (externed, state) |
| 7 | + val = unthunk(x) |
| 8 | + element, state = iterate(val) |
| 9 | + return element, (val, state) |
10 | 10 | end |
11 | 11 |
|
12 | | -@inline function Base.iterate(::AbstractThunk, (externed, state)) |
13 | | - element, new_state = iterate(externed, state) |
14 | | - return element, (externed, new_state) |
| 12 | +@inline function Base.iterate(::AbstractThunk, (val, state)) |
| 13 | + element, new_state = iterate(val, state) |
| 14 | + return element, (val, new_state) |
15 | 15 | end |
16 | 16 |
|
17 | 17 | ##### |
@@ -62,7 +62,7 @@ Do not use `@thunk` if this would be equal or more work than actually evaluating |
62 | 62 | - The expression is merely wrapping something in a `struct`, such as `Adjoint(x)` or `Diagonal(x)` |
63 | 63 | - The expression being itself a `thunk` |
64 | 64 | - The expression being from another `rrule` or `frule` (it would be `@thunk`ed if required by the defining rule already) |
65 | | -- There is only one derivative being returned, so from the fact that the user called `frule`/`rrule` |
| 65 | +- There is only one derivative being returned, so from the fact that the user called `frule`/`rrule` |
66 | 66 | they clearly will want to use that one. |
67 | 67 | """ |
68 | 68 | struct Thunk{F} <: AbstractThunk |
|
0 commit comments