I see what you’ve done, now, after diffing your code with mine. That’s a very nice improvement; it generalizes to cover more Sequences and doesn’t require an Equatable generator. Great job!
> On Dec 31, 2015, at 9:30 PM, Susan Cheng <[email protected]> wrote: > > I didn't explain correctly. > > let's take this: > > let c = Multipass(Fib(a: 1, b: -1, limit: 10)) > > this sequences should have results with [1, -1, 0, -1, -1, ...] > So is c.startIndex.successor() equal to > c.startIndex.successor().successor().successor()?? > > Dave Abrahams <[email protected] <mailto:[email protected]>> 於 > 2016年1月1日星期五 寫道: > >> On Dec 31, 2015, at 8:22 PM, 鄭齊峯 via swift-evolution >> <[email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >> >> if you try my modification, it will crash. > > Only because your Sequence genereates an arithmetic underflow. I don’t > understand what point you’re trying to make >> >> struct Fib : SequenceType { >> >> var a: Int >> var b: Int >> >> var limit: Int >> >> func generate() -> FibGenerator { >> return Generator(a: a, b: b, limit: limit) >> } >> } >> >> let c = Multipass(Fib(a: 1, b: -1, limit: 10)) >> >> A SequenceType becomes a CollectionType only work by adding a Index. that >> the most significantly different of sequence and collection. > > I think I understand that pretty well, having designed both of those > abstractions, but still don’t get your point. Sorry, I’m trying here, but I > can’t figure out what you’re trying to tell me. > >> >> /// A `CollectionType` containing the same elements as `Base`, without >> storing them. >> /// >> /// - Requires: `Base` supports multiple passes (traversing it does not >> /// consume the sequence), and `Base.Generator` has value semantics >> public struct Multipass<Base: SequenceType> : CollectionType { >> public var startIndex: MultipassIndex<Base> { >> var g = _base.enumerate().generate() >> if let (idx, val) = g.next() { >> return MultipassIndex(index: idx, buffer: val, generator: g) >> } >> return MultipassIndex(index: nil, buffer: nil, generator: g) >> } >> >> public var endIndex: MultipassIndex<Base> { >> return MultipassIndex(index: nil, buffer: nil, generator: >> _base.enumerate().generate()) >> } >> >> public subscript(position: MultipassIndex<Base>) -> >> Base.Generator.Element { >> return position.buffer! >> } >> >> public init(_ base: Base) { >> _base = base >> } >> >> var _base: Base >> } >> >> // Note: Requires T.Generator has value semantics >> public struct MultipassIndex<T: SequenceType> : ForwardIndexType { >> public func successor() -> MultipassIndex { >> var r = self >> if let (idx, val) = r.generator.next() { >> r.index = idx >> r.buffer = val >> } else { >> r.index = nil >> r.buffer = nil >> } >> return r >> } >> var index: Int? >> var buffer: T.Generator.Element? >> var generator: EnumerateSequence<T>.Generator >> } >> >> public func == <T>(x: MultipassIndex<T>, y: MultipassIndex<T>) -> Bool { >> return x.index == y.index >> } >> >> //===--- An example fibonacci sequence >> ------------------------------------===// >> struct FibGenerator : GeneratorType { >> mutating func next() -> Int? { >> let c = a + b >> a = b >> b = c >> return a < limit ? a : nil >> } >> var a, b, limit: Int >> } >> >> >> struct Fib : SequenceType { >> var limit = 100 >> >> func generate() -> FibGenerator { >> return Generator(a: 0, b: 1, limit: limit) >> } >> } >> >> It's true that ForwardIndexType is also run-through the base one by one but >> it also correct that getting specific value with specific index. >> >> c[c.startIndex.successor().successor().successor()] // it's a defined behave > > Again, not sure what you’re trying to say here. > >> >> >>> Dave Abrahams <[email protected] >>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> 於 2016年1月1日 下午12:00 >>> 寫道: >>> >>>> >>>> On Dec 31, 2015, at 7:46 PM, Susan Cheng <[email protected] >>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>> >>>> >>>> How GeneratorType confirm to Equatable?? >>> >>> I don’t understand the question. In the code I posted there’s a working >>> example of how a GeneratorType model can conform to Equatable.. >>> >>>> >>>> struct Fib : SequenceType { >>>> >>>> var a: Int >>>> var b: Int >>>> >>>> var limit: Int >>>> >>>> func generate() -> FibGenerator { >>>> return Generator(a: a, b: b, limit: limit) >>>> } >>>> } >>>> >>>> let c = Multipass(Fib(a: 1, b: -1, limit: 10)) >>>> >>>> -Susan >>>> >>>> >>>> 2016-01-01 11:17 GMT+08:00 Dave Abrahams <[email protected] >>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>: >>>> FWIW, Indexable is an implementation artifact that will go away when >>>> Swift’s generics system is improved. >>>> >>>> But if your real objection is that you have to come up with an Index and a >>>> subscripting operator, I can understand that. Part of the reason for this >>>> is our reluctance to create any distinct protocols with identical >>>> syntactic requirements >>>> <http://news.gmane.org/find-root.php?message_id=2a3e0c76-1c88-4752-8a70-aa64bb142...@apple.com >>>> >>>> <http://news.gmane.org/find-root.php?message_id=2a3e0c76-1c88-4752-8a70-aa64bb142...@apple.com>>. >>>> To justify having a separate multi-pass sequence protocol, there would >>>> have to be a significant/important class of multi-pass sequences for which >>>> CollectionType was unimplementable without serious costs. >>>> >>>> In principle there’s a way to ease the pain of creating CollectionType >>>> conformances for multipass SequenceTypes…if only it didn’t crash the >>>> compiler <https://bugs.swift.org/browse/SR-427 >>>> <https://bugs.swift.org/browse/SR-427>> ;-). Here’s a variation that uses >>>> a generic adapter instead of a protocol conformance declaration: >>>> >>>> /// A `CollectionType` containing the same elements as `Base`, without >>>> storing them. >>>> /// >>>> /// - Requires: `Base` supports multiple passes (traversing it does not >>>> /// consume the sequence), and `Base.Generator` has value semantics >>>> public struct Multipass<Base: SequenceType where Base.Generator: >>>> Equatable> : CollectionType { >>>> public var startIndex: MultipassIndex<Base> { >>>> var g = _base.generate() >>>> return MultipassIndex(buffer: g.next(), generator: g) >>>> } >>>> >>>> public var endIndex: MultipassIndex<Base> { >>>> return MultipassIndex(buffer: nil, generator: _base.generate()) >>>> } >>>> >>>> public subscript(position: MultipassIndex<Base>) -> >>>> Base.Generator.Element { >>>> return position.buffer! >>>> } >>>> >>>> public init(_ base: Base) { >>>> _base = base >>>> } >>>> >>>> var _base: Base >>>> } >>>> >>>> // Note: Requires T.Generator has value semantics >>>> public struct MultipassIndex<T: SequenceType where T.Generator: Equatable> >>>> : ForwardIndexType { >>>> public func successor() -> MultipassIndex { >>>> var r = self >>>> r.buffer = r.generator.next() >>>> return r >>>> } >>>> var buffer: T.Generator.Element? >>>> var generator: T.Generator >>>> } >>>> >>>> public func == <T>(x: MultipassIndex<T>, y: MultipassIndex<T>) -> Bool { >>>> return x.buffer == nil && y.buffer == nil || x.generator == y.generator >>>> } >>>> >>>> //===--- An example fibonacci sequence >>>> ------------------------------------===// >>>> struct FibGenerator : GeneratorType { >>>> mutating func next() -> Int? { >>>> let c = a + b >>>> a = b >>>> b = c >>>> return a < limit ? a : nil >>>> } >>>> var a, b, limit: Int >>>> } >>>> >>>> >>>> struct Fib : SequenceType { >>>> var limit = 1000 >>>> >>>> func generate() -> FibGenerator { >>>> return Generator(a: 0, b: 1, limit: limit) >>>> } >>>> } >>>> >>>> //===--- Adapt Fib for use with Multipass >>>> ---------------------------------===// >>>> extension FibGenerator : Equatable {} >>>> func == (x: Fib.Generator, y: Fib.Generator) -> Bool { >>>> return x.a == y.a >>>> } >>>> >>>> //===--- Demonstration >>>> ----------------------------------------------------===// >>>> let c = Multipass(Fib()) >>>> print(c.first) >>>> print(c.count) >>>> print(c.lazy.map { $0 + 1 }) >>>> >>> >>> -Dave >> >> _______________________________________________ >> swift-evolution mailing list >> [email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');> >> https://lists.swift.org/mailman/listinfo/swift-evolution >> <https://lists.swift.org/mailman/listinfo/swift-evolution> > -Dave > -Dave
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
