From 66e6c54aa45bde70dc1147f451f48b2f4b80bad6 Mon Sep 17 00:00:00 2001 From: Quentin Jin Date: Thu, 18 Apr 2019 10:11:41 +0800 Subject: [PATCH] Use nested type `BagKey.Gen` --- Sources/Schedule/Bag.swift | 39 ++++++++++++------------------ Tests/ScheduleTests/BagTests.swift | 2 +- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/Sources/Schedule/Bag.swift b/Sources/Schedule/Bag.swift index d82a648..848fd61 100644 --- a/Sources/Schedule/Bag.swift +++ b/Sources/Schedule/Bag.swift @@ -3,29 +3,20 @@ import Foundation /// A unique key for removing an element from a bag. struct BagKey: Equatable { - fileprivate let i: UInt64 + private let i: UInt64 - fileprivate init(underlying: UInt64) { - self.i = underlying - } -} - -/// A generator that can generate a sequence of unique `BagKey`. -/// -/// let k1 = gen.next() -/// let k2 = gen.next() -/// ... -struct BagKeyGenerator: Sequence, IteratorProtocol { - - typealias Element = BagKey - - private var k = BagKey(underlying: 0) - - /// Advances to the next key and returns it, or nil if no next key exists. - mutating func next() -> BagKey? { - if k.i == UInt64.max { return nil } - defer { k = BagKey(underlying: k.i + 1) } - return k + /// A generator that can generate a sequence of unique `BagKey`. + /// + /// let k1 = gen.next() + /// let k2 = gen.next() + /// ... + struct Gen { + private var key = BagKey(i: 0) + init() { } + mutating func next() -> BagKey { + defer { key = BagKey(i: key.i + 1) } + return key + } } } @@ -44,13 +35,13 @@ struct Bag { private typealias Entry = (key: BagKey, val: Element) - private var keyGen = BagKeyGenerator() + private var keyGen = BagKey.Gen() private var entries: [Entry] = [] /// Appends a new element at the end of this bag. @discardableResult mutating func append(_ new: Element) -> BagKey { - let key = keyGen.next()! + let key = keyGen.next() let entry = (key: key, val: new) entries.append(entry) diff --git a/Tests/ScheduleTests/BagTests.swift b/Tests/ScheduleTests/BagTests.swift index 97be43e..12b7b1c 100644 --- a/Tests/ScheduleTests/BagTests.swift +++ b/Tests/ScheduleTests/BagTests.swift @@ -6,7 +6,7 @@ final class BagTests: XCTestCase { typealias Fn = () -> Int func testBagKey() { - var g = BagKeyGenerator() + var g = BagKey.Gen() let k1 = g.next() let k2 = g.next() XCTAssertNotNil(k1)