Hi Ross,

That was a hell of an example! However, even with the types as they are now, 
the code needn’t look so dreadful. With following protocols in place:

protocol Indexed {
        associatedtype Index : Hashable
        var index: Index { get }
}

protocol NodeType : Indexed { }
protocol EdgeType: Indexed { }

protocol GraphType {
        associatedtype Node : NodeType
        associatedtype Edge : EdgeType
        
        var nodes: [Node] { get }
        var edges: [Edge] { get }
}

We can define `Graph` and `Path` as:

struct Graph<Node:NodeType, Edge:EdgeType> : GraphType {
        let nodes: [Node] = [] // todo
        let edges: [Edge] = [] // todo
}

struct Path<Node:NodeType, Edge:EdgeType> {}

So the function with the endless signature you’ve got would become:

extension Graph {
        func shortestPath(from from: Node, to: Node) -> Path<Node, Edge> {
                fatalError("todo")
        }
}

As for my link to Chris’s proposal, all I meant is to point out that there is a 
proposal under review with an identical name as this thread. I certainly did 
not mean to discourage discussion James started!

milos

> On 6 Apr 2016, at 21:45, Ross O'Brien <narrativium+sw...@gmail.com> wrote:
> 
> It's not the same topic. Let's take an example: suppose we have a data 
> structure for a graph of nodes and edges, where the nodes and edges are 
> indexed and both have values. So we have a Graph<NodeIndex : Hashable, 
> EdgeIndex : Hashable, NodeValue, EdgeValue>.
> Now suppose we want a shortest path from one node to another, and we have a 
> data structure to represent that. Now we have a Path<NodeIndex : Hashable, 
> EdgeIndex : Hashable, NodeValue, EdgeValue>. They both have the same 'generic 
> signature'. If you're navigating a Graph<String, Int, City, Motorway>, you're 
> going to want a Path<String, Int, City, Motorway> as output.
> 
> Right now you might write that as:
> func shortestPath<NodeIndex, EdgeIndex, NodeValue, 
> EdgeValue>(graph:Graph<NodeIndex, EdgeIndex, NodeValue, EdgeValue>, 
> startNode: NodeIndex, endNode: NodeIndex> -> Path<NodeIndex, EdgeIndex, 
> NodeValue, EdgeValue>
> 
> It might save a fair amount of typing if we had a generic equivalent to both 
> typealias and associatedtype.
> 
> associatedgenerics GraphElements = <NodeIndex : Hashable, EdgeIndex : 
> Hashable, NodeValue, EdgeValue>
> func shortestPath<GraphElements>(graph: Graph<GraphElements>, 
> startNode<GraphElements.NodeIndex>, endNode<GraphElements.NodeIndex>) -> 
> Path<GraphElements>
> 
> genericalias NavigationGraphElements = GraphElements<String, Int, City, 
> Motorway>
> 
> typealias NavigationGraph = Graph<NavigationGraphElements>
> // navigationGraph.shortestPath() now returns a Path<NavigationGraphElements>
> // this last part is closest to the proposal under review.
> 
> 
> On Wed, Apr 6, 2016 at 9:05 PM, Milos Rankovic via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> Chris Lattner has a proposal under review 
> <https://github.com/apple/swift-evolution/blob/master/proposals/0048-generic-typealias.md>
>  on this topic. 
> 
> milos
> 
>> On 6 Apr 2016, at 20:41, James Campbell via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> This was inspired from the topic about moving where clauses out of parameter 
>> lists.
>> 
>> Certain generics get very long winded, I was wondering if we could create 
>> some sort of alias for generics.
>> 
>> func anyCommonElements <T: SequenceType, U: SequenceType where 
>> T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> 
>> (lhs: T, _ rhs: U) -> Bool
>> 
>> could be shared across functions like so:
>> 
>> genericalias SequencesWithSameElements<T, U> =  <T: SequenceType, U: 
>> SequenceType where T.Generator.Element: Equatable, T.Generator.Element == 
>> U.Generator.Element>
>> 
>> func anyCommonElements <SequencesWithSameElements> (lhs: T, _ rhs: U) -> Bool
>> func == <SequencesWithSameElements> (lhs: T, _ rhs: U) -> Bool
>> ___________________________________
>> 
>> James⎥
>> 
>> ja...@supmenow.com <mailto:ja...@supmenow.com>⎥supmenow.com 
>> <http://supmenow.com/>
>> Sup
>> 
>> Runway East
>> 
>> 
>> 10 Finsbury Square
>> 
>> London
>> 
>> 
>> EC2A 1AF 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to