diff --git a/src/BangBang.jl b/src/BangBang.jl index b140ca41..bc25059b 100644 --- a/src/BangBang.jl +++ b/src/BangBang.jl @@ -4,6 +4,7 @@ module BangBang @doc read(joinpath(dirname(@__DIR__), "README.md"), String) BangBang export @!, + Empty, append!!, delete!!, empty!!, @@ -33,7 +34,7 @@ function ismutable end function push!! end include("NoBang/NoBang.jl") -using .NoBang: ImmutableContainer, singletonof +using .NoBang: Empty, ImmutableContainer, singletonof include("core.jl") include("base.jl") diff --git a/src/NoBang/NoBang.jl b/src/NoBang/NoBang.jl index b130cf4f..2d78c1f5 100644 --- a/src/NoBang/NoBang.jl +++ b/src/NoBang/NoBang.jl @@ -1,6 +1,6 @@ module NoBang -export singletonof +export Empty, singletonof using Base.Iterators: Pairs using Base: ImmutableDict @@ -17,6 +17,7 @@ include("singletoncontainers.jl") include("base.jl") include("linearalgebra.jl") include("singletonof.jl") +include("emptycontainers.jl") function __init__() @require StaticArrays="90137ffa-7385-5640-81b9-e52037218182" begin diff --git a/src/NoBang/emptycontainers.jl b/src/NoBang/emptycontainers.jl new file mode 100644 index 00000000..c885d6bb --- /dev/null +++ b/src/NoBang/emptycontainers.jl @@ -0,0 +1,35 @@ +""" + Empty(T) + +Create a proxy of an empty container of type `T`. + +# Examples +```jldoctest +julia> using BangBang + +julia> push!!(Empty(Vector), 1) +1-element Array{Int64,1}: + 1 + +julia> append!!(Empty(Dict), (:a=>1, :b=>2)) +Dict{Symbol,Int64} with 2 entries: + :a => 1 + :b => 2 + +julia> using DataFrames: DataFrame + +julia> @assert push!!(Empty(DataFrame), (a=1, b=2)) == DataFrame(a=[1], b=[2]) + +julia> using StructArrays: StructVector + +julia> @assert push!!(Empty(StructVector), (a=1, b=2)) == StructVector(a=[1], b=[2]) + +julia> using TypedTables: Table + +julia> @assert push!!(Empty(Table), (a=1, b=2)) == Table(a=[1], b=[2]) +``` +""" +struct Empty{T} end +Empty(T::Type) = Empty{T}() + +push(::Empty{T}, x) where T = singletonof(T, x)