1
0
mirror of https://github.com/kalmarek/Groups.jl.git synced 2024-12-26 02:20:30 +01:00

rework DirectProdIter to the new iteration protocol

This commit is contained in:
kalmarek 2018-09-21 18:14:48 +02:00
parent e28c296bce
commit 0750a47853
2 changed files with 13 additions and 23 deletions

View File

@ -118,7 +118,7 @@ parent(g::DirectProductGroupElem) =
# #
############################################################################### ###############################################################################
Base.size(g::DirectProductGroupElem) = size(g.elts) size(g::DirectProductGroupElem) = size(g.elts)
Base.IndexStyle(::Type{DirectProductGroupElem}) = Base.LinearFast() Base.IndexStyle(::Type{DirectProductGroupElem}) = Base.LinearFast()
Base.getindex(g::DirectProductGroupElem, i::Int) = g.elts[i] Base.getindex(g::DirectProductGroupElem, i::Int) = g.elts[i]
@ -276,10 +276,7 @@ end
# #
############################################################################### ###############################################################################
import Base: size, length, start, next, done, eltype struct DirectPowerIter{GrEl<:AbstractAlgebra.GroupElem}
struct DirectPowerIter{Gr<:AbstractAlgebra.Group, GrEl<:AbstractAlgebra.GroupElem}
G::Gr
N::Int N::Int
elts::Vector{GrEl} elts::Vector{GrEl}
totalorder::Int totalorder::Int
@ -287,27 +284,20 @@ struct DirectPowerIter{Gr<:AbstractAlgebra.Group, GrEl<:AbstractAlgebra.GroupEle
end end
function DirectPowerIter(G::Gr, N::Integer) where {Gr<:AbstractAlgebra.Group} function DirectPowerIter(G::Gr, N::Integer) where {Gr<:AbstractAlgebra.Group}
return DirectPowerIter{Gr, elem_type(G)}( return DirectPowerIter{elem_type(G)}(N, collect(G), order(G)^N, order(G))
G,
N,
vec(collect(elements(G))),
Int(order(G))^N,
Int(order(G))
)
end end
Base.size(DPIter::DirectPowerIter) = ntuple(i -> DPIter.orderG, DPIter.N) length(DPIter::DirectPowerIter) = DPIter.totalorder
Base.length(DPIter::DirectPowerIter) = DPIter.totalorder
Base.start(::DirectPowerIter) = 0
function Base.next(DPIter::DirectPowerIter, state) function iterate(DPIter::DirectPowerIter, state=0)
idx = ind2sub(size(DPIter), state+1) if state >= DPIter.totalorder
return nothing
end
idx = Tuple(CartesianIndices(ntuple(i -> DPIter.orderG, DPIter.N))[state+1])
return DirectProductGroupElem([DPIter.elts[i] for i in idx]), state+1 return DirectProductGroupElem([DPIter.elts[i] for i in idx]), state+1
end end
Base.done(DPIter::DirectPowerIter, state) = DPIter.totalorder <= state eltype(::Type{DirectPowerIter{GrEl}}) where {GrEl} = DirectProductGroupElem{GrEl}
Base.eltype(::Type{DirectPowerIter{Gr, GrEl}}) where {Gr, GrEl} = DirectProductGroupElem{GrEl}
@doc doc""" @doc doc"""
elements(G::DirectProductGroup) elements(G::DirectProductGroup)

View File

@ -4,9 +4,9 @@ module Groups
using AbstractAlgebra using AbstractAlgebra
import AbstractAlgebra: Group, GroupElem, Ring import AbstractAlgebra: Group, GroupElem, Ring
import AbstractAlgebra: parent, parent_type, elem_type import AbstractAlgebra: parent, parent_type, elem_type
import AbstractAlgebra: elements, order, gens, matrix_repr import AbstractAlgebra: order, gens, matrix_repr
import Base: length, ==, hash, show, convert import Base: length, ==, hash, show, convert, eltype, iterate
import Base: inv, reduce, *, ^, power_by_squaring import Base: inv, reduce, *, ^, power_by_squaring
import Base: findfirst, findnext import Base: findfirst, findnext
import Base: deepcopy_internal import Base: deepcopy_internal