Latest 0.3.0 https://github.com/shopgun/swift-generic-geometry MIT ios 8.0, osx 10.9, tvos 9.0, watchos 2.0 Laurie Hufford

📐 Generic Geometry

Did you ever need to make a CGSize that didn’t contain CGFloats? What about a Point of enum values? Edges where some values are optional?

All this, and more, is possible with Generic Geometry.

Includes the following types:

• Point<Value>
• Size<Value>
• Rect<Value>
• Edges<Value>
• Corners<Value>

This allows you to do things like:

let maybeSize: Size<Int?> = Size(width: nil, height: 15)
// w: nil, h: Optional(15)

let concreteSize: Size<Int> = maybeSize.unwrapped(or: Size(999))
// w: 999, h: 15

let stringSize: Size<String> = concreteSize.map(String.init)
// w: "999", h: "15"

let scaledSize = concreteSize.multipling(by: Size<Int>(width: 10, height: 100))
// w: 9990, h: 1500

let boolPoint: Point<Bool> = Point(x: true, y: false)
// x: true, y: false

let tuplePoint: Point<(Bool, Int)> = boolPoint.zip(Point<Int>(5))
// x:(true, 5), y:(false, 5)

let mappedPoint: Point<Double> = tuplePoint.map { \$0 ? Double(\$1) * 2 : Double(\$1) / 2 }
// x:10.0, y:2.5

Types

Point<Value>

An x/y point in a 2d coordinate system.

• init(x: Value, y: Value) / init(Value)
• zero
• map / zip / zipWith
• == (when Value: Equatable)
• init(cgPoint: CGPoint) / cgPoint / withCGFloats

Size<Value>

A width and height pair, representing a size in a 2d coordinate system.

• init(width: Value, height: Value) / init(Value)
• zero
• map / zip / zipWith
• == (when Value: Equatable)
• multipling(by: Value) / multipling(by: Size<Value>)
• dividing(by: Value) / dividing(by: Size<Value>)
• inset(Edges<Value>) / outset(Edges<Value>)
• clamped(min: Size<Value>, max: Size<Value>)
• unwrapped(or: Size<A>) (when Value == Optional<A>)
• init(cgSize: CGSize) / cgSize / withCGFloats

Rect<Value>

A combination of a Point and a Size, representing a rectangle in a 2d coordinate system. origin & size use the same underlying Value type.

• init(origin: Point<Value>, size: Size<Value>) / init(x: Value, y: Value, width: Value, height: Value)
• zero
• map / zip / zipWith
• == (when Value: Equatable)
• cornerPoints: Corners<Point<Value>>
• inset(by: Edges<Value>) / inset(by: Value)
• outset(by: Edges<Value>) / outset(by: Value)
• init(cgRect: CGRect) / cgRect / withCGFloats

Edges<Value>

Contains values for the 4 edges of a rectange.

• init(top: Value, left: Value, bottom: Value, right: Value) / init(Value)
• zero
• map / zip / zipWith
• == / isUniform (when Value: Equatable)
• negated
• cgRectEdges: [CGRectEdge: Value] / value(forEdge: CGRectEdge) / withCGFloats
• uiEdgeInsets

Corners<Value>

Contains values for the 4 corners of a rectange.

• init(topLeft: Value, topRight: Value, bottomLeft: Value, bottomRight: Value) / init(Value)
• zero
• map / zip / zipWith
• == / isUniform (when Value: Equatable)
• withCGFloats

Latest podspec

{
"name": "ShopGun-GenericGeometry",
"module_name": "GenericGeometry",
"version": "0.3.0",
"summary": "ud83dudcd0 A library for defining geometry of generic dimensions",
"description": "Did you ever need to make a CGSize that didn't contain CGFloats? What about a Point of enum values? Edges where some values are optional? All this, and more, is possible with GenericGeometry.",
"homepage": "https://github.com/shopgun/swift-generic-geometry",
"authors": {
"Laurie Hufford": "[email protected]"
},
"source": {
"git": "https://github.com/shopgun/swift-generic-geometry.git",
"tag": "0.3.0"
},
"swift_versions": "5.0",
"platforms": {
"ios": "8.0",
"osx": "10.9",
"tvos": "9.0",
"watchos": "2.0"
},
"source_files": [
"Sources",
"Sources/**/*.swift"
]
}