1 #Region "Microsoft.VisualBasic::7eb6cd69dfaed745f3a3b0e22f3c805d, Microsoft.VisualBasic.Core\Extensions\IO\PathMatch.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     Structure PathMatch
35     
36     '     Function: __pairs, Pairs, ToString
37     
38     Module PathMatches
39     
40     '     Function: Pairs
41     
42     ' /********************************************************************************/
43
44 #End Region
45
46 Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
47 Imports Microsoft.VisualBasic.Serialization.JSON
48
49 Public Structure PathMatch
50
51     Dim Pair1 As String
52     Dim Pair2 As String
53
54     Public Overrides Function ToString() As String
55         Return Me.GetJson
56     End Function
57
58     Public Shared Iterator Function Pairs(paths1 As IEnumerable(Of String), path2 As IEnumerable(Of String), Optional process As Func(Of StringString) = NothingAs IEnumerable(Of PathMatch)
59         Dim pas1 As String() = paths1.ToArray
60         Dim pas2 As String() = path2.ToArray
61
62         If process Is Nothing Then
63             process = Function(s) s
64         End If
65
66         If pas1.Length >= pas2.Length Then
67             For Each x As PathMatch In __pairs(pas1, pas2, process)
68                 Yield x
69             Next
70         Else
71             For Each x As PathMatch In __pairs(pas2, pas1, process)
72                 Yield x
73             Next
74         End If
75     End Function
76
77     ''' <summary>
78     ''' <paramref name="paths1"/>的元素要比<paramref name="path2"/>多
79     ''' </summary>
80     ''' <param name="paths1"></param>
81     ''' <param name="path2"></param>
82     ''' <returns></returns>
83     Private Shared Iterator Function __pairs(paths1 As String(), path2 As String(), process As Func(Of StringString)) As IEnumerable(Of PathMatch)
84         Dim pls = (From p As String In path2 Select name = process(p.BaseName), p).ToArray
85
86         For Each path As String In paths1
87             Dim q As String = process(path.BaseName)
88
89             For Each S In pls
90                 If InStr(q, S.name, CompareMethod.Text) = 1 OrElse
91                     InStr(S.name, q, CompareMethod.Text) = 1 Then
92                     Yield New PathMatch With {
93                         .Pair1 = path,
94                         .Pair2 = S.p
95                     }
96                     Exit For
97                 End If
98             Next
99         Next
100     End Function
101 End Structure
102
103 Public Module PathMatches
104
105     Public Iterator Function Pairs(ParamArray paths As NamedValue(Of String())()) As IEnumerable(Of Dictionary(Of StringString))
106         Dim primary As NamedValue(Of String()) = paths(Scan0)
107         Dim others = (From path As NamedValue(Of String())
108                       In paths.Skip(1)
109                       Select path.Name,
110                           pls = (From p As String
111                                  In path.Value
112                                  Select pName = p.BaseName,
113                                      p).ToArray).ToArray
114
115         For Each path As String In primary.Value
116             Dim q As String = path.BaseName
117             Dim result As New Dictionary(Of StringString) From {{primary.Name, path}}
118
119             For Each otherpath In others
120                 For Each S In otherpath.pls
121                     If InStr(q, S.pName, CompareMethod.Text) = 1 OrElse
122                         InStr(S.pName, q, CompareMethod.Text) = 1 Then
123
124                         result.Add(otherpath.Name, S.p)
125                         Exit For
126                     End If
127                 Next
128             Next
129
130             If result.Count = paths.Length Then
131                 Yield result
132             End If
133         Next
134     End Function
135 End Module