[swift-dev] Set of "no less than one" member enforced by the compiler

Brent Royal-Gordon brent at architechies.com
Sun Jun 26 14:46:03 CDT 2016

> Half-digression into relational theory aside, I can’t figure a way to make the compiler enforce this. An enum is "exactly one", a Set is "zero or more", a structure or class is "this group", an Optional is "zero or one".

You can write an enum that's "one or more":

	enum OneOrMore<Element> {
		case one (Element)
		indirect case more (first: Element, rest: OneOrMore<Element>)

Or, equivalently:

	struct OneOrMore<Element> {
		var first: Element
		var rest: [Element]

`first` could instead be `last`, of course; I've done it this way because `reduce` is a left fold.

It should be possible to conform either of these to Collection or even MutableCollection, but not to RangeReplaceableCollection, which assumes you can create an empty instance.

Brent Royal-Gordon

More information about the swift-dev mailing list