abstract type AbstractSep{T} end
struct Sep{T<:Union{Nothing, Tuple{<:AbstractSep, <:AbstractSep}}} <: AbstractSep{T}
a::T
end
Sep(x::AbstractSep, y::AbstractSep) = Sep((x, y))
const Nil = Sep(nothing)
Base.show(io::IO, ::Sep{Nothing}) = print(io, "Nil")
Base.show(io::IO, x::Sep{<:Tuple}) = print(io, x.a)
Nil
Nil
a = Sep(Nil, Nil)
(Nil, Nil)
b = Sep(a, a)
((Nil, Nil), (Nil, Nil))
c = Sep(a, b)
((Nil, Nil), ((Nil, Nil), (Nil, Nil)))
typeof(c)
Sep{Tuple{Sep{Tuple{Sep{Nothing}, Sep{Nothing}}}, Sep{Tuple{Sep{Tuple{Sep{Nothing}, Sep{Nothing}}}, Sep{Tuple{Sep{Nothing}, Sep{Nothing}}}}}}}