1 #Region "Microsoft.VisualBasic::66f0b60ec1f735a22f5f3204e303ba2f, Microsoft.VisualBasic.Core\ComponentModel\System.Collections.Generic\MapsHelper.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 MapsHelper
35     
36     '         Constructor: (+1 OverloadsSub New
37     '         FunctionGetValue, ToString
38     
39     '     Structure Map
40     
41     '         Properties: Key, Maps
42     
43     '         Constructor: (+1 OverloadsSub New
44     '         FunctionToString
45     '         Interface IMap
46     
47     '             Properties: Key, Maps
48     
49     
50     
51     '     Structure IDMap
52     
53     '         Properties: Key, Maps
54     
55     '         Function: ParseFromTsv, ParseTsvFile, ToString, TSV
56     
57     
58     ' /********************************************************************************/
59
60 #End Region
61
62 Imports System.Runtime.CompilerServices
63 Imports Microsoft.VisualBasic.ComponentModel.Collection.Generic
64 Imports Microsoft.VisualBasic.Language
65 Imports Microsoft.VisualBasic.Serialization.JSON
66 Imports Microsoft.VisualBasic.Text
67
68 Namespace ComponentModel
69
70     ''' <summary>
71     ''' 其实这个对象就是字典查询的一个简化操作而已
72     ''' </summary>
73     ''' <typeparam name="T"></typeparam>
74     Public Structure MapsHelper(Of T)
75
76         ReadOnly __default As T
77         ReadOnly __maps As IReadOnlyDictionary(Of String, T)
78
79         Default Public ReadOnly Property Value(key$) As T
80             <MethodImpl(MethodImplOptions.AggressiveInlining)>
81             Get
82                 Return GetValue(key)
83             End Get
84         End Property
85
86         Sub New(map As IReadOnlyDictionary(Of String, T), Optional [default] As T = Nothing)
87             __default = [default]
88             __maps = map
89         End Sub
90
91         Public Function GetValue(key As StringAs T
92             If __maps.ContainsKey(key) Then
93                 Return __maps(key)
94             Else
95                 Return __default
96             End If
97         End Function
98
99         <MethodImpl(MethodImplOptions.AggressiveInlining)>
100         Public Overrides Function ToString() As String
101             Return __maps.DictionaryData.GetJson
102         End Function
103     End Structure
104
105     Public Structure Map(Of T1, V)
106         Implements IMap
107
108         ''' <summary>
109         ''' The map source
110         ''' </summary>
111         ''' <returns></returns>
112         Public Property Key As T1 Implements IMap.Key
113         ''' <summary>
114         ''' The mapped target value.
115         ''' </summary>
116         ''' <returns></returns>
117         Public Property Maps As V Implements IMap.Maps
118
119         Sub New(x As T1, y As V)
120             Key = x
121             Maps = y
122         End Sub
123
124         Public Overrides Function ToString() As String
125             Return $"map[{Key}, {Maps}]"
126         End Function
127
128         ''' <summary>
129         ''' 与<see cref="IKeyValuePairObject(Of TKey, TValue)"/>相比,这个类型更加倾向于特定化的描述两个对象之间的一一对应关系
130         ''' </summary>
131         Public Interface IMap
132             Property Key As T1
133             Property Maps As V
134         End Interface
135
136         <MethodImpl(MethodImplOptions.AggressiveInlining)>
137         Public Shared Narrowing Operator CType(map As Map(Of T1, V)) As (key As T1, mapAs As V)
138             Return (map.Key, map.Maps)
139         End Operator
140
141         ''' <summary>
142         ''' 因为map主要的作用是获取得到key所配对的value结果,所以在这里是转换为<see cref="Maps"/>结果值的
143         ''' </summary>
144         ''' <param name="map"></param>
145         ''' <returns></returns>
146         ''' 
147         <MethodImpl(MethodImplOptions.AggressiveInlining)>
148         Public Shared Narrowing Operator CType(map As Map(Of T1, V)) As V
149             Return map.Maps
150         End Operator
151     End Structure
152
153     ''' <summary>
154     ''' 字符串类型的映射
155     ''' </summary>
156     Public Structure IDMap : Implements Map(Of StringString).IMap
157         Implements INamedValue
158
159         ''' <summary>
160         ''' 
161         ''' </summary>
162         ''' <returns></returns>
163         ''' <remarks>
164         ''' 虽然说这个对象也实现了<see cref="INamedValue"/>接口,但是Key也可能是会出现重复的
165         ''' </remarks>
166         Public Property Key As String Implements Map(Of StringString).IMap.Key, INamedValue.Key
167         Public Property Maps As String Implements Map(Of StringString).IMap.Maps
168
169         ''' <summary>
170         ''' 将这个映射转换为tsv文件之中的一行数据
171         ''' </summary>
172         ''' <returns></returns>
173         ''' 
174         <MethodImpl(MethodImplOptions.AggressiveInlining)>
175         Public Function TSV() As String
176             Return Key & vbTab & Maps
177         End Function
178
179         Public Shared Function ParseFromTsv(line$) As IDMap
180             Dim t = line.Split(ASCII.TAB)
181
182             If t.Length = 0 Then
183                 Return New IDMap
184             ElseIf t.Length = 1 Then
185                 t.Add("")
186             End If
187
188             Return New IDMap With {
189                 .Key = t(0),
190                 .Maps = t(1)
191             }
192         End Function
193
194         ''' <summary>
195         ''' 将TSV文件之中的数据行解析为IDMapping结果
196         ''' </summary>
197         ''' <param name="path$"></param>
198         ''' <param name="haveHeader"></param>
199         ''' <param name="header"></param>
200         ''' <returns></returns>
201         Public Shared Function ParseTsvFile(path$, Optional haveHeader As Boolean = FalseOptional ByRef header As IDMap = NothingAs IDMap()
202             Dim lines$() = path.ReadAllLines
203             Dim out As New List(Of IDMap)
204
205             If haveHeader Then
206                 header = ParseFromTsv(lines(Scan0))
207             End If
208
209             For Each line As String In lines.Skip(If(haveHeader, 1, 0))
210                 out += IDMap.ParseFromTsv(line)
211             Next
212
213             Return out
214         End Function
215
216         Public Overrides Function ToString() As String
217             Return $"{Key} --> {Maps}"
218         End Function
219
220         <MethodImpl(MethodImplOptions.AggressiveInlining)>
221         Public Shared Widening Operator CType(map As Map(Of StringString)) As IDMap
222             Return New IDMap With {
223                 .Key = map.Key,
224                 .Maps = map.Maps
225             }
226         End Operator
227
228         <MethodImpl(MethodImplOptions.AggressiveInlining)>
229         Public Shared Widening Operator CType(map As IDMap) As Map(Of StringString)
230             Return New Map(Of StringStringWith {
231                 .Key = map.Key,
232                 .Maps = map.Maps
233             }
234         End Operator
235     End Structure
236 End Namespace