@inline function (-){S<:Sculpt,Q<:Qualia,C<:Clay}(a::Flex{S,Q,C})
   Flex{negate(S), C}(-a.hi, -a.lo)
end

for T in (:CLCL, :OPOP)
   @eval begin
       function (-){Q<:Qualia,C<:Clay}(a::Flex{$T,Q,C}, b::Flex{$T,Q,C})
           lo = (-)(a.lo, b.hi, RoundDown)
           hi = (-)(a.hi, b.lo, RoundUp)
           Flex{$T,Q,C}(lo,hi)
       end
   end       
end

function (-){S<:Sculpt, T<:Sculpt,Q<:Qualia, C<:Clay}(a::Flex{S,Q,C}, b::Flex{T,Q,C})
    aLoIsOpen, aHiIsOpen = boundries(S)
    bLoIsOpen, bHiIsOpen = boundries(T)
    sculpting = boundries(aLoIsOpen|bLoIsOpen, aHiIsOpen|bHiIsOpen)
    
    lo = (-)(a.lo, b.hi, RoundDown)
    hi = (-)(a.hi, b.lo, RoundUp)
       
    Flex{sculpting,Q,C}(lo,hi)
end

(-){S<:Sculpt,Q<:Qualia,C<:Clay}(a::Flex{S,Q,C}, b::C) = (-)(a, Flex{S,Q,C}(b))
(-){S<:Sculpt,Q<:Qualia,C<:Clay}(a::C, b::Flex{S,Q,C}) = (-)(Flex{S,Q,C}(a), b)
