Swiftpack.co - YOCKOW/SwiftRanges as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by YOCKOW.
YOCKOW/SwiftRanges 3.1.3
`SwiftRanges` provides some kinds of range that are not implemented in Swift Standard Library.
⭐️ 1
🕓 40 weeks ago
.package(url: "https://github.com/YOCKOW/SwiftRanges.git", from: "3.1.3")

What is SwiftRanges?

SwiftRanges provides some kinds of range that are not implemented in Swift Standard Library.
It was originally written as a part of SwiftCGIResponder.

Ranges

Name Lower Bound Upper Bound Implemented in
ClosedRange Included Included Swift Standard Library
LeftOpenRange Excluded Included This Library
OpenRange Excluded Excluded This Library
Range Included Excluded Swift Standard Library
PartialRangeFrom Included (Pos. Inf.) Swift Standard Library
PartialRangeGreaterThan Excluded (Pos. Inf.) This Library
PartialRangeThrough (Neg. Inf.) Included Swift Standard Library
PartialRangeUpTo (Neg. Inf.) Excluded Swift Standard Library
UnboundedRange (Neg. Inf.) (Pos. Inf.) Swift Standard Library

Other structs implemented in this library

  • AnyRange: A type-erased range.
  • RangeDictionary: A collection like Dictionary whose key is a range.
  • MultipleRanges: A set that can contain multiple types of ranges.

Requirements

  • Swift 4.1, 4.2, 5(recommended)
  • macOS or Linux

Usage

Left-Open Ranges

import Ranges

let leftOpenRange: LeftOpenRange<Int> = 10<..20
print(leftOpenRange.contains(10)) // -> false
print(leftOpenRange.contains(15)) // -> true
print(leftOpenRange.contains(20)) // -> true

let openRange: OpenRange<Int> = 10<..<20
print(openRange.contains(10)) // -> false
print(openRange.contains(15)) // -> true
print(openRange.contains(20)) // -> false

let greaterThan: PartialRangeGreaterThan<Int> = 10<..
print(greaterThan.contains(10)) // -> false
print(greaterThan.contains(Int.max)) // -> true

print(greaterThan.overlaps(...11)) // -> true
print(greaterThan.overlaps(..<11)) // -> false
                                   // Because there is no integer in "10<..<11"

Type-erased Range: AnyRange

import Ranges
// Original operators are implemented for `AnyRange`.
// Some of them are below:

let leftOpenRange: LeftOpenRange<Int> = 10<..20
let typeErasedLeftOpenRange: AnyRange<Int> = 10<...20
print(leftOpenRange == typeErasedLeftOpenRange) // -> true

let openRange: OpenRange<Int> = 10<..<20
let typeErasedOpenRange: AnyRange<Int> = 19<...<30
print(openRange.overlaps(typeErasedOpenRange)) // -> false

let greaterThan: PartialRangeGreaterThan<Int> = 10<..
let typeErasedGreaterThan: AnyRange<Int> = 20<...
print(greaterThan.contains(15)) // -> true
print(typeErasedGreaterThan.contains(15)) // -> false

RangeDictionary

var dic: RangeDictionary<Int, String> = [
  1....2: "Index",
  3....10: "Chapter 01",
  11....40: "Chapter 02"
]

print(dic[1]) // Prints "Index"
print(dic[5]) // Prints "Chapter 01"
print(dic[15]) // Prints "Chapter 02"
print(dic[100]) // Prints "nil"

dic.insert("Prologue", forRange: 2....5)
print(dic[5]) // Prints "Prologue"

MultipleRanges

import Ranges

var multi = MultipleRanges<Int>()
multi.insert(10...20) 
multi.insert(30...40)
print(multi.contains(15)) // -> true
print(multi.contains(25)) // -> false
print(multi.contains(35)) // -> true

multi.subtract(15...35)
print(multi.ranges) // -> [10..<15, 35<..40]

Other methods like Set are also implemented in MultipleRanges:

  • intersection(_:)
  • union(_:)
  • symmetricDifference(_:)

License

MIT License.
See "LICENSE.txt" for more information.

GitHub

link
Stars: 1
Last commit: 40 weeks ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

Release v3.1.3.
40 weeks ago

What's Changed

Full Changelog: https://github.com/YOCKOW/SwiftRanges/compare/3.1.2...3.1.3

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics