@@ -6,31 +6,38 @@ struct Space{T}
66 s:: T
77end
88
9- Space (s:: Type{T} ) where {T} = Space (typemin (T): typemax (T))
9+ Space (s:: Type{T} ) where {T<: Number } = Space (typemin (T): typemax (T))
1010
11- Space (x, dims:: Int... ) = Space (fill (x, dims))
12- Space (x:: Type{T} , dims:: Int... ) where {T<: Integer } = Space (fill (typemin (x): typemax (T), dims))
13- Space (x:: Type{T} , dims:: Int... ) where {T<: AbstractFloat } = Space (fill (typemin (x) .. typemax (T), dims))
11+ Space (x, dims:: Int... ) = Space (Fill (x, dims))
12+ Space (x:: Type{T} , dim:: Int , extra_dims:: Int... ) where {T<: Integer } = Space (Fill (typemin (x): typemax (T), dim, extra_dims... ))
13+ Space (x:: Type{T} , dim:: Int , extra_dims:: Int... ) where {T<: AbstractFloat } = Space (Fill (typemin (x) .. typemax (T), dim, extra_dims... ))
14+ Space (x:: Type{T} , dim:: Int , extra_dims:: Int... ) where {T} = Space (Fill (T, dim, extra_dims... ))
1415
1516Base. size (s:: Space ) = size (SpaceStyle (s))
17+ Base. length (s:: Space ) = length (SpaceStyle (s), s)
18+ Base. getindex (s:: Space , i... ) = getindex (SpaceStyle (s), s, i... )
19+ Base.:(== )(s1:: Space , s2:: Space ) = s1. s == s2. s
1620
1721# ####
1822
1923abstract type AbstractSpaceStyle{S} end
2024
21- Base. size (:: AbstractSpaceStyle{S} ) where {S} = S
22-
2325struct DiscreteSpaceStyle{S} <: AbstractSpaceStyle{S} end
2426struct ContinuousSpaceStyle{S} <: AbstractSpaceStyle{S} end
2527
2628SpaceStyle (:: Space{<:Tuple} ) = DiscreteSpaceStyle {()} ()
27- SpaceStyle (:: Space{<:AbstractRange } ) = DiscreteSpaceStyle {()} ()
29+ SpaceStyle (:: Space{<:AbstractVector{<:Number} } ) = DiscreteSpaceStyle {()} ()
2830SpaceStyle (:: Space{<:AbstractInterval} ) = ContinuousSpaceStyle {()} ()
2931
3032SpaceStyle (s:: Space{<:AbstractArray{<:Tuple}} ) = DiscreteSpaceStyle {size(s.s)} ()
3133SpaceStyle (s:: Space{<:AbstractArray{<:AbstractRange}} ) = DiscreteSpaceStyle {size(s.s)} ()
3234SpaceStyle (s:: Space{<:AbstractArray{<:AbstractInterval}} ) = ContinuousSpaceStyle {size(s.s)} ()
3335
36+ Base. size (:: AbstractSpaceStyle{S} ) where {S} = S
37+ Base. length (:: DiscreteSpaceStyle{()} , s) = length (s. s)
38+ Base. getindex (:: DiscreteSpaceStyle{()} , s, i... ) = getindex (s. s, i... )
39+ Base. length (:: DiscreteSpaceStyle , s) = mapreduce (length, * , s. s)
40+
3441# ####
3542
3643Random. rand (rng:: Random.AbstractRNG , s:: Space ) = rand (rng, s. s)
@@ -45,6 +52,7 @@ Random.rand(
4552) = map (x -> rand (rng, x), s. s)
4653
4754Base. in (x, s:: Space ) = x in s. s
55+ Base. in (x, s:: Space{<:Type} ) = x isa s. s
4856
4957Base. in (
5058 x,
@@ -69,15 +77,20 @@ function Random.rand(rng::AbstractRNG, s::Interval{:closed,:closed,T}) where {T}
6977 end
7078end
7179
80+ Base. iterate (s:: Space , args... ) = iterate (SpaceStyle (s), s, args... )
81+ Base. iterate (:: DiscreteSpaceStyle{()} , s:: Space , args... ) = iterate (s. s, args... )
82+
7283# ####
7384
74- const TupleSpace = Tuple{Vararg{<: Space }}
85+ const TupleSpace = Tuple{Vararg{Space}}
7586const NamedSpace = NamedTuple{<: Any ,<: TupleSpace }
87+ const VectorSpace = Vector{<: Space }
7688const DictSpace = Dict{<: Any ,<: Space }
7789
78- Random. rand (rng:: AbstractRNG , s:: Union{TupleSpace,NamedSpace} ) = map (x -> rand (rng, x), s)
90+ Random. rand (rng:: AbstractRNG , s:: Union{TupleSpace,NamedSpace,VectorSpace } ) = map (x -> rand (rng, x), s)
7991Random. rand (rng:: AbstractRNG , s:: DictSpace ) = Dict (k => rand (rng, s[k]) for k in keys (s))
8092
8193Base. in (xs:: Tuple , ts:: TupleSpace ) = length (xs) == length (ts) && all (((x, s),) -> x in s, zip (xs, ts))
94+ Base. in (xs:: AbstractVector , ts:: VectorSpace ) = length (xs) == length (ts) && all (((x, s),) -> x in s, zip (xs, ts))
8295Base. in (xs:: NamedTuple{names} , ns:: NamedTuple{names,<:TupleSpace} ) where {names} = all (((x, s),) -> x in s, zip (xs, ns))
8396Base. in (xs:: Dict , ds:: DictSpace ) = length (xs) == length (ds) && all (k -> haskey (ds, k) && xs[k] in ds[k], keys (xs))
0 commit comments