## The Issue
Given
``` swift
public protocol Zipper1D : CustomStringConvertible {
    associatedtype Element
}
```

We can almost write a `flatMap`  which keeps the general identity of self
and swaps out the Element in the output.

``` swift
func flatMap<
        NewElement, SegmentOfResult : Collection, Output : Zipper1D where
        SegmentOfResult.Iterator.Element == NewElement, Output.Element ==
NewElement>
        (_ transform: @noescape (Element) throws -> SegmentOfResult)
rethrows -> Output
```

## The Proposal
I propose that we allow `Type.withoutSpecialization`

``` swift
func flatMap<
        NewElement, SegmentOfResult : Collection, Output : Zipper1D where
        SegmentOfResult.Iterator.Element == NewElement, Output.Element ==
NewElement, Output.withoutSpecialization == Self.withoutSepcialization>
        (_ transform: @noescape (Element) throws -> SegmentOfResult)
rethrows -> Output
```


I recognize that generic protocols are another possible solution to this
problem. I am pitching this because of how much closer this idea seems to
being realized.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to