public enum Specifier
{
  case Any
  case AtLeast(SemanticVersion)
  case CompatibleWith(SemanticVersion, ArbiterRequirementStrictness)
  case Exactly(SemanticVersion)
  indirect case Compound([Specifier])
  // TODO: Custom
}

public final class Requirement : CObject
{
  public convenience init (_ specifier: Specifier)
  {
    let ptr: COpaquePointer

    switch specifier {
    case .Any:
      ptr = ArbiterCreateRequirementAny()

    case let .AtLeast(version):
      ptr = ArbiterCreateRequirementAtLeast(version.pointer)

    case let .CompatibleWith(version, strictness):
      ptr = ArbiterCreateRequirementCompatibleWith(version.pointer, strictness)

    case let .Exactly(version):
      ptr = ArbiterCreateRequirementExactly(version.pointer)

    case let .Compound(specifiers):
      let requirements = specifiers.map { s in Requirement(s) }
      let requirementPtrs = requirements.map { $0.pointer }

      ptr = requirementPtrs.withUnsafeBufferPointer { buffer in
        return ArbiterCreateRequirementCompound(buffer.baseAddress, buffer.count)
      }
    }

    self.init(ptr, shouldCopy: false)
  }

  public func satisfiedBy (version: SemanticVersion) -> Bool
  {
    return ArbiterRequirementSatisfiedBy(pointer, version.pointer)
  }
}

public enum Specifier
{
  case Any
  case AtLeast(SemanticVersion)
  case CompatibleWith(SemanticVersion, ArbiterRequirementStrictness)
  case Exactly(SemanticVersion)
}

public final class Requirement : CObject
{
  public convenience init (_ specifier: Specifier)
  {
    let ptr: COpaquePointer

    switch specifier {
    case .Any:
      ptr = ArbiterCreateRequirementAny()

    case let .AtLeast(version):
      ptr = ArbiterCreateRequirementAtLeast(version.pointer)

    case let .CompatibleWith(version, strictness):
      ptr = ArbiterCreateRequirementCompatibleWith(version.pointer, strictness)

    case let .Exactly(version):
      ptr = ArbiterCreateRequirementExactly(version.pointer)
    }

    self.init(ptr, shouldCopy: false)
  }

  public func satisfiedBy (version: SemanticVersion) -> Bool
  {
    return ArbiterRequirementSatisfiedBy(pointer, version.pointer)
  }
}

--- 
+++ 
@@ -4,6 +4,8 @@
   case AtLeast(SemanticVersion)
   case CompatibleWith(SemanticVersion, ArbiterRequirementStrictness)
   case Exactly(SemanticVersion)
+  indirect case Compound([Specifier])
+  // TODO: Custom
 }
 
 public final class Requirement : CObject
@@ -24,6 +26,14 @@
 
     case let .Exactly(version):
       ptr = ArbiterCreateRequirementExactly(version.pointer)
+
+    case let .Compound(specifiers):
+      let requirements = specifiers.map { s in Requirement(s) }
+      let requirementPtrs = requirements.map { $0.pointer }
+
+      ptr = requirementPtrs.withUnsafeBufferPointer { buffer in
+        return ArbiterCreateRequirementCompound(buffer.baseAddress, buffer.count)
+      }
     }
 
     self.init(ptr, shouldCopy: false)
Add compound requirement API to Swift bindings
