[ANN] FGenerators.jl: Python-like generator syntax for high-performance iteration

Hi,

This is such a fantastic package - thank you for creating it.

I was successfully using it for some time, including earlier today, until a recent update to 1.7.2 and now receive the following issues:

errors

ERROR: LoadError: Method Error: no method matching length(::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}) Closest candidates are: length(!Matched::Union{Base.KeySet, Base.ValueIterator}) at abstractdict.jl:58 length(!Matched::Union{Tables.AbstractColumns, Tables.AbstractRow}) at C:\Users\me\.julia\packages\Tables\M26tI\src\Tables.jl:175 length(!Matched::Union{DataStructures.OrderedRobinDict, DataStructures.RobinDict}) at C:\Users\me\.julia\packages\DataStructures\vSp4s\src\ordered_robin_dict.jl:86 ... Stacktrace: [1] amount(xs::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}) @ SplittablesBase.Implementations ~\.julia\packages\SplittablesBase\gpREK\src\implementations.jl:65 [2] transduce_assoc(xform::Transducers.IdentityTransducer, step::Transducers.AdHocRF{Main.GetMetricService.QueryResolver.var"##oninit_function#361#81", typeof(identity), Main.GetMetricService.QueryResolver.var"##reducing_function#362#82"{Vector{String}, Arrow.Table, Dict{String, Vector{Tuple{Int64, Float64}}}, Arrow.Primitive{Union{Missing, Int64}, Vector{Int64}}}, typeof(identity), typeof(identity), Main.GetMetricService.QueryResolver.var"##combine_function#363#83"}, init::Transducers.InitOf{Transducers.DefaultInitOf}, coll0::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}; simd::Val{false}, basesize::Nothing, stoppable::Nothing, nestlevel::Nothing) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\reduce.jl:108 [3] transduce(xf::Transducers.IdentityTransducer, rf::Function, init::Transducers.InitOf{Transducers.DefaultInitOf}, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, exc::ThreadedEx{NamedTuple{(:simd,), Tuple{Val{false}}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\executors.jl:152 [4] transduce(xf::Transducers.IdentityTransducer, rf::Function, init::Transducers.InitOf{Transducers.DefaultInitOf}, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, exc::PreferParallel{NamedTuple{(:simd,), Tuple{Val{false}}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\executors.jl:164 [5] _fold @ ~\.julia\packages\FLoops\3ZEuy\src\reduce.jl:851 [inlined] [6] _fold(rf::Transducers.AdHocRF{Main.GetMetricService.QueryResolver.var"##oninit_function#361#81", typeof(identity), Main.GetMetricService.QueryResolver.var"##reducing_function#362#82"{Vector{String}, Arrow.Table, Dict{String, Vector{Tuple{Int64, Float64}}}, Arrow.Primitive{Union{Missing, Int64}, Vector{Int64}}}, typeof(identity), typeof(identity), Main.GetMetricService.QueryResolver.var"##combine_function#363#83"}, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, #unused#::Nothing, simd::Val{false}) @ FLoops ~\.julia\packages\FLoops\3ZEuy\src\reduce.jl:849 [7] macro expansion @ ~\.julia\packages\FLoops\3ZEuy\src\reduce.jl:829 [inlined] [8] groupOverIndexSpace(column::String, colSet::Vector{String}, data::Arrow.Table, enumerable::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}) @ Main.GetMetricService.QueryResolver ~\source\repos\GetMetricEngineCore\src\QueryResolverIterable.jl:1983 [9] macro expansion @ ~\source\repos\GetMetricEngineCore\src\QueryResolverIterable.jl:1763 [inlined] [10] (::Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#323#53")(__rf__#257::Transducers.BottomRF{Transducers.SideEffect{Main.GetMetricService.QueryResolver.var"#2#5"{Set{Any}}}}, __acc__#258::Nothing, xs#324::NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.DataDominance, AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, Int64, Int64}}) @ Main.GetMetricService.QueryResolver ~\.julia\packages\FGenerators\N3bhz\src\FGenerators.jl:290 [11] __foldl__ @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1339 [inlined] [12] #transduce#140 @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:523 [inlined] [13] transduce @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:520 [inlined] [14] transduce(xform::Transducers.IdentityTransducer, f::Transducers.SideEffect{Main.GetMetricService.QueryResolver.var"#2#5"{Set{Any}}}, init::Nothing, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#323#53", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.DataDominance, AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, Int64, Int64}}}; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\processes.jl:506 [15] transduce(xform::Transducers.IdentityTransducer, f::Transducers.SideEffect{Main.GetMetricService.QueryResolver.var"#2#5"{Set{Any}}}, init::Nothing, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#323#53", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.DataDominance, AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, Int64, Int64}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\processes.jl:505 [16] foreach(eff::Main.GetMetricService.QueryResolver.var"#2#5"{Set{Any}}, reducible::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#323#53", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.DataDominance, AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, Int64, Int64}}}; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1128 [17] foreach(eff::Main.GetMetricService.QueryResolver.var"#2#5"{Set{Any}}, reducible::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#323#53", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.DataDominance, AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getQueryIndexes#foldl#281#27", NamedTuple{(:tabularSource, :IQueryModel, :enumerable, :MinVal, :MaxVal), Tuple{Main.GetMetricService.QueryResolver.DataSetConverterModels.TabularSource, Main.GetMetricService.QueryModels.Between, Int64, Int64, Int64}}}, Int64, Int64}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1127 [18] macro expansion @ ~\source\repos\GetMetricEngineCore\src\QueryResolverIterable.jl:236 [inlined] [19] (::Main.GetMetricService.QueryResolver.var"##getData#foldl#257#3")(__rf__#257::Transducers.BottomRF{Transducers.SideEffect{Main.GetMetricService.GetMetricBase.var"#1#2"{Vector{Main.GetMetricService.GetMetricModels.ComputeSetCollection}}}}, __acc__#258::Nothing, xs#258::NamedTuple{(:queryModel,), Tuple{Main.GetMetricService.QueryModels.QueryDataModel}}) @ Main.GetMetricService.QueryResolver ~\.julia\packages\FGenerators\N3bhz\src\FGenerators.jl:290 [20] __foldl__ @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1339 [inlined] [21] #transduce#140 @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:523 [inlined] [22] transduce @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:520 [inlined] [23] transduce(xform::Transducers.IdentityTransducer, f::Transducers.SideEffect{Main.GetMetricService.GetMetricBase.var"#1#2"{Vector{Main.GetMetricService.GetMetricModels.ComputeSetCollection}}}, init::Nothing, coll::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getData#foldl#257#3", NamedTuple{(:queryModel,), Tuple{Main.GetMetricService.QueryModels.QueryDataModel}}}; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ Transducers ~\.julia\packages\Transducers\CnpYX\src\processes.jl:506 [24] transduce @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:505 [inlined] [25] #foreach#149 @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1128 [inlined] [26] foreach @ ~\.julia\packages\Transducers\CnpYX\src\processes.jl:1127 [inlined] [27] getMetric(requestID::String, queryResultsSet::AdHocFoldable{Main.GetMetricService.QueryResolver.var"##getData#foldl#257#3", NamedTuple{(:queryModel,), Tuple{Main.GetMetricService.QueryModels.QueryDataModel}}}, analyticsRequests::Vector{Main.GetMetricService.GetMetricRequests.GetMetricRequestModels.IAnalyticsRequest}, resultSetSchema::Vector{String}, analyticsColumns::Vector{String}, subsetSchema::Vector{String}) @ Main.GetMetricService.GetMetricBase ~\source\repos\GetMetricEngineCore\src\GetMetricBase.jl:64 [28] getMetric(getMetricRequest::Main.GetMetricService.GetMetricRequests.GetMetricRequestModels.GetMetricRequestEndPoint) @ Main.GetMetricService ~\source\repos\GetMetricEngineCore\src\GetMetricService.jl:90 [29] top-level scope @ show.jl:955 in expression starting at c:\Users\me\source\repos\GetMetricEngineCore\src\runtests.jl:287

the manifest for the project is (I’ve omitted non - relevant packages since I exceeded the character limit originally):

Manifest

`

[[BangBang]]
deps = [“Compat”, “ConstructionBase”, “Future”, “InitialValues”, “LinearAlgebra”, “Requires”, “Setfield”, “Tables”, “ZygoteRules”]
git-tree-sha1 = “d648adb5e01b77358511fb95ea2e4d384109fac9”
uuid = “198e06fe-97b7-11e9-32a5-e1d131e6ad66”
version = “0.3.35”

[[FGenerators]]
deps = [“AbstractYieldMacros”, “ContextualMacros”, “FLoopsBase”, “MacroTools”, “Transducers”]
git-tree-sha1 = “dd2f057dbda6ad499e82cd89489865c14452a5d0”
uuid = “4fd0377b-cfdc-4941-97f4-8d7ddbb8981e”
version = “0.1.4”

[[FLoops]]
deps = [“BangBang”, “Compat”, “FLoopsBase”, “InitialValues”, “JuliaVariables”, “MLStyle”, “Serialization”, “Setfield”, “Transducers”]
git-tree-sha1 = “4391d3ed58db9dc5a9883b23a0578316b4798b1f”
uuid = “cc61a311-1640-44b5-9fba-1b764f453329”
version = “0.2.0”

[[FLoopsBase]]
deps = [“ContextVariablesX”]
git-tree-sha1 = “656f7a6859be8673bf1f35da5670246b923964f7”
uuid = “b9860ae5-e623-471e-878b-f6a53c775ea6”
version = “0.1.1”

[[SplittablesBase]]
deps = [“Setfield”, “Test”]
git-tree-sha1 = “39c9f91521de844bad65049efd4f9223e7ed43f9”
uuid = “171d559e-b47b-412a-8079-5efa626c420e”
version = “0.1.14”

[[Transducers]]
deps = [“Adapt”, “ArgCheck”, “BangBang”, “Baselet”, “CompositionsBase”, “DefineSingletons”, “Distributed”, “InitialValues”, “Logging”, “Markdown”, “MicroCollections”, “Requires”, “Setfield”, “SplittablesBase”, “Tables”]
git-tree-sha1 = “1cda71cc967e3ef78aa2593319f6c7379376f752”
uuid = “28d57a85-8fef-5791-bfe6-a80928e7c999”
version = “0.4.72”

`

with Julia version 1.6.0 (where it used to work but now fails after running Pkg.update()), 1.6.5 (where it didnt) and 1.7.2 (where it also didn’t).

Having attempted and failed to write a length / amount required for the @fgenerator, I’m reaching out in case this is a version issue or something easily resolved / reported by others. Google searches haven’t yielded anything to suggest this is well reported

I’m at a bit of a loss as this was a great case of “it just works” originally so hoping it’s something straightforward.

Regards,