LinqKit icon indicating copy to clipboard operation
LinqKit copied to clipboard

LINQ-like extensions for Swift

LinqKit

LINQ-like extensions for Swift

Originally extracted from 101 LINQ Samples in Swift, LinqKit gives Swift more functional powers making working with models and collections more enjoyable.

let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]
let lowNums = numbers.find { $0 < 5 }


let digits = [ "zero", "one", "two", "three", "four", "five", 
               "six", "seven", "eight", "nine" ]
               
let shortDigits = digits.find { digit, index in digit.length < index }


let numbersA = [ 0, 2, 4, 5, 6, 8, 9 ]
let numbersB = [ 1, 3, 5, 7, 8 ]

let pairs = numbersA.expand { a in
    numbersB
        .find { b in a < b }
        .map { i -> (a: Int, b:Int) in (a, i) }
    }

let take3 = numbers.take(3)
let skip3 = numbers.skip(3)

let firstNumbersLessThan6 = numbers.takeWhile { $0 < 6 }

var index = 0
let firstSmallNumbers = numbers.takeWhile { $0 >= index++ }

let allButFirst3Numbers = numbers.skipWhile { $0 % 3 != 0 }

let sortedProducts = products.sortBy(
    { compare($0.category, $1.category) },
    { compare($1.unitPrice, $0.unitPrice) }
)

let numberGroups = numbers.groupBy { $0 % 5 }
    .map { g -> (Remainder: Int, Numbers: Group<Int,Int>) in
        (g.key, g)
    }

let anagrams = [ "from   ", " salt", " earn ", "  last   ", " near ", " form  " ]

let orderGroups = anagrams.groupBy({ (s:String) in s.trim() }, anagramComparer)

let orderGroups = anagrams.groupBy({ (s:String) in s.trim() },
    matchWith: anagramComparer,
    valueAs: { s in s.uppercaseString })

let factorsOf300 = [ 2, 2, 3, 5, 5 ]
let uniqueFactors = distinct(factorsOf300)

let numbersA = [ 0, 2, 4, 5, 6, 8, 9 ]
let numbersB = [ 1, 3, 5, 7, 8 ]
let uniqueNumbers = union(numbersA, numbersB)
let commonNumbers = intersection(numbersA, numbersB)
let aOnlyNumbers = difference(numbersA, numbersB)


let scoreRecords = [
    ( Name: "Alice", Score: 50),
    ( Name: "Bob", Score: 40),
    ( Name: "Cathy", Score: 45),
]
let scoreRecordsDict = scoreRecords.toDictionary {
    (x:(Name:String,Score:Int)) in x.Name
}

let strings = [ "zero", "one", "two", "three", "four", "five", 
                "six", "seven", "eight", "nine" ]

let startsWithO = strings.firstWhere { $0.charAt(0) == "o" }

let numbers:Int[] = []
let firstNumOrDefault = numbers.firstWhere({ n in true }, orElse: { 0 })


let words = [ "believe", "relief", "receipt", "field" ]
let iAfterE = words.any { $0.contains("ei") }

let numbers = [ 1, 11, 3, 19, 41, 65, 19 ]
let onlyOdd = numbers.all { $0 % 2 == 1 }


let products = productsList()
let productGroups = products.groupBy { $0.category }
    .find { $0.items.all { p in p.unitsInStock > 0 } }
    .map { g -> (Category:String, Products:Group<String,Product>) in
        (g.key, g)
    }


let numSum:Int = numbers.sum()
let minNum:Int = numbers.min()
let maxNum:Int = numbers.max()

let totalChars = words.sum { (s:String) in s.length }
let shortestWord = words.min { (s:String) in s.length }
let averageNum = numbers.avg { $0 as Int }