mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
71 lines
2.7 KiB
Swift
71 lines
2.7 KiB
Swift
// RUN: %target-swift-frontend %s -emit-ir
|
|
|
|
protocol SourceTargetTransformable {
|
|
associatedtype Source
|
|
associatedtype Target
|
|
|
|
// FIXME: should really be a typealias once we support that
|
|
associatedtype Transformer = (Source) -> Target
|
|
}
|
|
|
|
|
|
struct PiecewiseTransformedIteratorOf<
|
|
Source,
|
|
Target,
|
|
SourceIterator: IteratorProtocol,
|
|
TransformerIterator: IteratorProtocol,
|
|
Transformable: SourceTargetTransformable
|
|
where
|
|
Transformable.Source == Source,
|
|
Transformable.Target == Target,
|
|
SourceIterator.Element == Source,
|
|
TransformerIterator.Element == Transformable.Transformer
|
|
>
|
|
: IteratorProtocol {
|
|
typealias Element = Target
|
|
|
|
var sourceIterator: SourceIterator
|
|
var transformerIterator: TransformerIterator
|
|
|
|
mutating func next() -> Element? {
|
|
let source: Transformable.Source? = sourceIterator.next()
|
|
if let source: Transformable.Source = source {
|
|
let transformer: Transformable.Transformer? = transformerIterator.next()
|
|
if let transformer: Transformable.Transformer = transformer {
|
|
let tfunc: ((Source) -> Target)? = transformer as? ((Source) -> Target)
|
|
if let tfunc = tfunc {
|
|
return tfunc(source)
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
struct PiecewiseTransformedSequenceOf<
|
|
SourceSequence: Sequence,
|
|
TransformerSequence: Sequence,
|
|
Transformable: SourceTargetTransformable
|
|
where
|
|
SourceSequence.Iterator.Element == Transformable.Source,
|
|
TransformerSequence.Iterator.Element == Transformable.Transformer
|
|
>: Sequence {
|
|
|
|
typealias Source = SourceSequence.Iterator.Element
|
|
typealias Target = Transformable.Target
|
|
typealias Iterator = PiecewiseTransformedIteratorOf<Source, Target, SourceSequence.Iterator, TransformerSequence.Iterator, Transformable>
|
|
|
|
|
|
let inputs: SourceSequence
|
|
let transformers: TransformerSequence
|
|
|
|
init(inputs: SourceSequence, transformers: TransformerSequence) {
|
|
self.inputs = inputs
|
|
self.transformers = transformers
|
|
}
|
|
|
|
func makeIterator() -> Iterator {
|
|
return PiecewiseTransformedIteratorOf(sourceIterator: inputs.makeIterator(), transformerIterator: transformers.makeIterator())
|
|
}
|
|
}
|