Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. using Transducers
  2. using Transducers: R_, wrap, Unseen, xform, inner, wrapping, wrap, unwrap
  3. import Transducers: start, next, complete
  4.  
  5. struct TransductionBuffer
  6. buffer::Vector{Any}
  7. end
  8.  
  9. Base.iterate(itr::TransductionBuffer, ::Any = nothing) =
  10. if isempty(itr.buffer)
  11. nothing
  12. else
  13. popfirst!(itr.buffer), nothing
  14. end
  15.  
  16. struct Transduction{T} <: Transducer
  17. ixf::T
  18. end
  19.  
  20. function start(rf::R_{Transduction}, result)
  21. buffer = []
  22. itr = xform(rf).ixf(TransductionBuffer(buffer))
  23. return wrap(rf, (itr, Unseen(), buffer), start(inner(rf), result))
  24. end
  25.  
  26. next(rf::R_{Transduction}, result, input) =
  27. wrapping(rf, result) do (itr, itstate0, buffer), result
  28. push!(buffer, input)
  29. if itstate0 isa Unseen
  30. ret = iterate(itr)
  31. else
  32. ret = iterate(itr, itstate0)
  33. end
  34. while true
  35. if ret === nothing
  36. return (itr, itstate0, buffer), reduced(complete(inner(rf), result))
  37. end
  38. itout, itstate = ret
  39. result = next(inner(rf), result, itout)
  40. if result isa Reduced || isempty(buffer)
  41. return (itr, itstate, buffer), result
  42. end
  43. ret = iterate(itr, itstate)
  44. end
  45. end
  46.  
  47. complete(rf::R_{Transduction}, result) =
  48. complete(inner(rf), unwrap(rf, result)[2])
  49.  
  50. @show collect(Transduction(itr -> Base.Generator(x -> x + 1, itr)), 1:2)
  51. @show collect(Transduction(itr -> Iterators.filter(isodd, itr)), 1:2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement