Last active
March 24, 2016 02:57
-
-
Save Nirma/58fb471d6e336906a443 to your computer and use it in GitHub Desktop.
Hatena Blog Gist
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//#Making Sequences work for you | |
// | |
// ไปๅใฎใใใใฏใฏSwift2.0ไปฅ้ใฎ`SequenceType`ใจใใใใญใใณใซใจใใใฎๅ ้จ็ใชๅใใซใคใใฆ็ดนไปใใพใใ`class`ใ`struct`ใ`SequenceType`ใใญใใณใซใซๆบๆ ใใใใจใ`for in`ใซใผใใ`map`, `filter`ใชใฉใไฝฟใใใใใซใชใใพใใ | |
// | |
//ใใใๅงใใพใใใ๏ผ | |
struct Unique<T: Comparable> { | |
private var backingStore: [T] = [] | |
var count: Int { | |
return backingStore.count | |
} | |
func setHas(element: T) -> Bool { | |
return backingStore.filter { $0 == element }.count != 0 | |
} | |
mutating func append(element: T) { | |
guard !setHas(element) else { return } | |
backingStore.append(element) | |
} | |
} | |
//ใใฎ`Unique`ใจใใๆง้ ไฝใฏใจใฆใใทใณใใซใงใใ`Comparable`ใซๆบๆ ใใๅใฎ่ฆ็ด ใ`append`ใใใจๅ ้จ็ใช้ ๅใซ่ฆ็ด ใ่ฟฝๅ ใใพใใ้ ๅไธญใซๅใ่ฆ็ด ใๅญๅจใใๅ ดๅใฏ่ฟฝๅ ใใพใใใ | |
// | |
//ใใใงใฏ`Unique`ใใในใใใฆใฟใพใใใ๏ผ | |
var mySet = Unique<String>() | |
// Our set can | |
mySet.setHas("A Careless Cat") //false | |
mySet.append("A Careless Cat") | |
mySet.setHas("A Careless Cat") //true | |
mySet.append("A Careless Cat") //ใใงใซใใๆๅญๅ | |
mySet.count //ใพใ 1ใงใ๏ผ | |
//ใใใกใใฃใจ้ ็ฎ่ฟฝๅ ใใพใใใ๏ผ | |
mySet.append("A Dangerous Dog[f:id:vasilyjp:20160324103132p:plain]") | |
mySet.append("A Diamond Dog") | |
mySet.append("Petty Parrot") | |
mySet.append("North American Reckless Raccoon") | |
mySet.append("A Monadic Mole") | |
// | |
//for animal in mySet { | |
// println(animal) | |
//} | |
let vowels = ["A","E","I","O","U"] | |
var gen = vowels.generate() | |
while let letter = gen.next() { | |
print(letter) | |
} | |
//`generate()`ใฏ`SequenceType`ใใญใใณใซใฎใกใฝใใใงใใ | |
//`Unique`ใฏ`SequenceType`ใใญใใณใซใซๆบๆ ใใฆใชใใฎใง`for in`ใๅใใชใใฎใงใใ | |
//ใใใงใฏใ`SequenceType`ใใญใใณใซใซๅฟ ่ฆใชๆกไปถใ่ฆใฆๅฎ่ฃ ใใฆใฟใพใใใ๏ผ | |
//public protocol SequenceType { | |
// associatedtype Generator : GeneratorType | |
// public func generate() -> Self.Generator | |
//} | |
//`generate()`ใฎๆปใๅคใฎๅใฏๅๆจ่ซใๅนใใฎใงใ`typealias Generator = ...`ใๆธใๅฟ ่ฆใฏใใใพใใใ | |
// | |
//`Unique`ใ`SequenceType`ใใญใใณใซใซๆบๆ ใใใฆใ`generate()`ใกใฝใใใๅฎ่ฃ ใใในใใงใใใใพใ `GeneratorType`ใฎใใจใใใ็ฅใใพใใใ | |
//ใใใงใฏ`GeneratorType`ใใใงใใฏใใพใใใ๏ผ | |
// | |
//##Generator ใจใฏ๏ผ | |
//public protocol GeneratorType { | |
// associatedtype Element | |
// public mutating func next() -> Self.Element? | |
//} | |
//`SequenceType`ใจๅใใใใซไธใคใฎใกใฝใใใใใใใพใใใ`next()`ใฎๆปใๅคใฎๅใฏใ`Element`ๅใจใชใฃใฆใใพใใๅๆจ่ซใๅนใใพใใ`[String]`ใงใใใฐใๅฎ้ใซใฏ`String`ใซใชใใพใใ | |
//`Generator`ใฏ`next()`ใกใฝใใใงใไฟๆใใฆใใใใผใฟใ้ ็ชใซ่ฟใใพใใๆๅพใฎใใผใฟใ่ฟใใใใจๅๅบฆ`next()`ใๅผใถใจ`nil`ใ่ฟใใพใใ | |
// | |
//`GeneratorType`ใไฝฟใ็ตใใใจๅๅฉ็จใงใใพใใใๅใใใผใฟใปใใใใใไธๅบฆ`GeneratorType`ใง่ชญใฟใใใใฐใๆฐใใ`GeneratorType`ใ็ๆใใๅฟ ่ฆใใใใพใใ | |
// | |
//ใใใฆใ`generate()`ใๅฎ่ฃ ใใๆใซๆปใๅคใฎ`GeneratorType`ใจไปใฎ`GeneratorType`ๅคๆฐใฎ็ถๆ ใๅ ฑๆใใชใใใใซใใชใใใฐใใใพใใใ | |
// | |
//ๅบๆฌ็ใชไธ้ใใใ`GeneratorType`: | |
struct CountToGenerator: GeneratorType { | |
private var limit: Int | |
private var currentCount = 0 | |
init(limit: Int) { | |
self.limit = limit | |
} | |
mutating func next() -> Int? { | |
guard currentCount < limit else { return nil } | |
defer { currentCount += 1 } | |
return currentCount | |
} | |
} | |
var goTillTen = CountToGenerator(limit: 10) | |
while let num = goTillTen.next() { | |
print(num) | |
} | |
//`SequenceType`ใจ`GeneratorType`ใๅญฆใใ ใฎใงใ`Unique`ๅฐ็จใฎ`GeneratorType`ใไฝใใพใใใ๏ผ | |
//class UniqueGenerator<T>: GeneratorType { | |
// private var _generationMethod: () -> T? | |
// init(_generationMethod: () -> T?) { | |
// self._generationMethod = _generationMethod | |
// } | |
// | |
// func next() -> T? { | |
// return _generationMethod() | |
// } | |
//} | |
// | |
//extension Unique: SequenceType { | |
// func generate() -> UniqueGenerator<T> { | |
// var iteration = 0 | |
// | |
// return UniqueGenerator { | |
// if iteration < self.backingStore.count { | |
// let result = self.backingStore[iteration] | |
// iteration += 1 | |
// return result | |
// } | |
// | |
// return nil | |
// } | |
// } | |
//} | |
//ใใใพใงๅญฆใใ ใใจใงใ`Unique`ใฎ`GeneratorType`ใฎๅฎ่ฃ ใใงใใพใใใใใใๅฐใ็ญใๆธใใพใใ | |
//`AnyGenerator`ใจใใGenericใฟใคใใไฝฟใใจ`UniqueGenerator`ใไฝใๅฟ ่ฆใใใใพใใใ | |
extension Unique: SequenceType { | |
func generate() -> AnyGenerator<T> { | |
var iteration = 0 | |
return AnyGenerator { | |
if iteration < self.backingStore.count { | |
let result = self.backingStore[iteration] | |
iteration += 1 | |
return result | |
} | |
return nil | |
} | |
} | |
} | |
//ใใไธๅบฆ`for in`ใซใผใใๆธใใพใใใ๏ผ | |
for item in mySet { | |
print(item) | |
} | |
//ใใฃใจๅใใพใใ๏ผ | |
//`map`ใจ`filter`ใๅใใพใ๏ผใใฃใ๏ผ | |
let cnt = mySet.map { Int($0.characters.count) } //[14, 15, 13, 12, 31, 14] | |
mySet.filter { $0.characters.first != "A" } //["Petty Parrot", "North American Reckless Raccoon"] | |
//#Controlling Sequences with Sequences | |
// | |
//`SequenceType`ใฎๅฎ่ฃ ๆฌก็ฌฌใงใใจใฆใๅคงใใใชในใใ็ก้ใชในใใไฝใใใจใใงใใพใใ | |
//ใใใใฃใใชในใใใๅ ้ ญใใ`n`ๅๅใๅบใใใจใใใจใใใฎใพใพไฝฟใใจ็ก้ใซใผใใซใชใฃใฆใใพใใพใใ | |
// | |
//ไพใใฐไธ่จใฎ`ThePattern`ใฏ็ก้ใชในใใงใใ | |
//`for in`ใงไฝฟใใจใ`Generator`ใ`nil`ใ่ฟใใชใใใใๆฐธ้ ใซ`0`ใ`1`ใ่ฟใใพใใ | |
class ThePattern: SequenceType { | |
func generate() -> AnyGenerator<Int> { | |
var isOne = true | |
return AnyGenerator { | |
isOne = !isOne | |
return isOne ? 1 : 0 | |
} | |
} | |
} | |
// ็ก้ใซใผใ | |
for i in ThePattern() { | |
print(i) | |
} | |
//ใใฎ็ก้ใชในใใใ | |
class First<S: SequenceType>: SequenceType { | |
private let limit: Int | |
private var counter: Int = 0 | |
private var generator: S.Generator | |
init(_ limit: Int, sequence: S) { | |
self.limit = limit | |
self.generator = sequence.generate() | |
} | |
func generate() -> AnyGenerator<S.Generator.Element> { | |
return AnyGenerator { | |
defer { self.counter += 1 } | |
guard self.counter < self.limit else { return nil } | |
return self.generator.next() | |
} | |
} | |
} | |
for item in First(5, sequence: ThePattern()) { | |
print(item) // 0 1 0 1 0 | |
} | |
//ใใใงใใญ๏ผ | |
//`First(n, sequence: s)` ใๅผใณๅบใใจใ`s`ใฎๅ ้ ญ`n`ๅใฎ่ฆ็ด ใๅใๅบใใพใใ | |
//`s`ใ็ก้ใชในใใ ใจใใฆใๆๅใฎ`n`ๅใใใใงใใฏใใชใใฎใงๅน็็ใงใใ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment