1 #Region "Microsoft.VisualBasic::dff727ac76a2cd9dd6fa1e6c78322672, Microsoft.VisualBasic.Core\Language\API.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     '     Module LanguageAPI
35     
36     '         Function: [ByRef], [Default], AsDefault, AsVector, DefaultValue
37     '                   IsNothing, Let, TypeDef, TypeInfo
38     
39     
40     ' /********************************************************************************/
41
42 #End Region
43
44 Imports System.Runtime.CompilerServices
45 Imports Microsoft.VisualBasic.Language.Default
46 Imports Microsoft.VisualBasic.Language.Perl
47 Imports Microsoft.VisualBasic.Language.Vectorization
48 Imports Microsoft.VisualBasic.Scripting.Runtime
49
50 Namespace Language
51
52     ''' <summary>
53     ''' The VisualBasic language syntax helper API.
54     ''' </summary>
55     Public Module LanguageAPI
56
57         ''' <summary>
58         ''' The default value assertor. If target object assert result is nothing or empty, then this function will returns True.
59         ''' </summary>
60         Friend ReadOnly defaultAssert As New DefaultValue(Of Assert(Of Object)) With {
61             .Value = AddressOf ExceptionHandler.Default,
62             .assert = Function(assert)
63                           Return assert Is Nothing
64                       End Function
65         }
66
67         <MethodImpl(MethodImplOptions.AggressiveInlining)>
68         Public Function TypeDef(Of T)() As TypeSchema
69             Return New TypeSchema(GetType(T))
70         End Function
71
72         <MethodImpl(MethodImplOptions.AggressiveInlining)>
73         <Extension>
74         Public Function TypeInfo(Of T)(x As T) As TypeSchema
75             Return TypeDef(Of T)()
76         End Function
77
78         'Private Sub test()
79         '    If TypeDef(Of Integer)() Or {GetType(Integer), GetType(Double)} Then
80         '    End If
81         'End Sub
82
83         ''' <summary>
84         ''' simulate the ``%||%`` operator in R language.
85         ''' 
86         ''' 模拟R语言之中的``%||%``操作符
87         ''' 
88         ''' ```R
89         ''' `%||%` &lt;- function(x, y) if (is.null(x)) y else x
90         ''' 
91         ''' NULL %||% 123
92         ''' # 123
93         ''' 
94         ''' 233 %||% 123
95         ''' # 233
96         ''' ```
97         ''' </summary>
98         ''' <typeparam name="T"></typeparam>
99         ''' <param name="x"></param>
100         ''' <param name="isNothing"></param>
101         ''' <returns></returns>
102         <MethodImpl(MethodImplOptions.AggressiveInlining)>
103         Public Function [Default](Of T)(x As T, Optional isNothing As Assert(Of Object) = NothingAs DefaultValue(Of T)
104             Return New DefaultValue(Of T) With {
105                 .Value = x,
106                 .assert = isNothing Or defaultAssert
107             }
108         End Function
109
110         ''' <summary>
111         ''' Using this value as the default value for this <typeparamref name="T"/> type.
112         ''' </summary>
113         ''' <typeparam name="T"></typeparam>
114         ''' <param name="x"></param>
115         ''' <param name="[If]"></param>
116         ''' <returns></returns>
117         <MethodImpl(MethodImplOptions.AggressiveInlining)>
118         <Extension>
119         Public Function AsDefault(Of T)(x As T, Optional [If] As Assert(Of Object) = NothingAs DefaultValue(Of T)
120             Return [Default](x, [If])
121         End Function
122
123         Public Function DefaultValue(Of T)(value As T) As DefaultValue(Of T)
124             Return New DefaultValue(Of T) With {
125                 .Value = value,
126                 .assert = defaultAssert
127             }
128         End Function
129
130         <MethodImpl(MethodImplOptions.AggressiveInlining)>
131         <Extension>
132         Public Function [When](Of T)([default] As T, expression As BooleanAs DefaultValue(Of T)
133             Return [default].AsDefault().When(expression)
134         End Function
135
136         <MethodImpl(MethodImplOptions.AggressiveInlining)>
137         <Extension>
138         Public Function [When](Of T)([default] As T, expression As Assert(Of T)) As DefaultValue(Of T)
139             Return [default].AsDefault().When(assert:=expression)
140         End Function
141
142         ''' <summary>
143         ''' Helper for update the value property of <see cref="Value(Of T)"/>
144         ''' 
145         ''' ```vbnet
146         ''' Call Let$(<see cref="Value(Of T)"/> = x)
147         ''' ```
148         ''' </summary>
149         ''' <typeparam name="T"></typeparam>
150         ''' <param name="value"></param>
151         ''' <returns></returns>
152         <MethodImpl(MethodImplOptions.AggressiveInlining)>
153         Public Function Let$(Of T)(value As T)
154             Try
155                 Return CStrSafe(value)
156             Catch ex As Exception
157                 ' 在这里知识进行帮助值的设置,所以这个错误无所谓,直接忽略掉
158                 Return Nothing
159             End Try
160         End Function
161
162 #Region "Helper for ``With``"
163
164         <MethodImpl(MethodImplOptions.AggressiveInlining)>
165         Public Function Self(Of T)() As Func(Of T, T)
166             Return AddressOf [ByRef]
167         End Function
168
169         ''' <summary>
170         ''' Extension method for VisualBasic ``With`` anonymous variable syntax source reference helper
171         ''' </summary>
172         ''' <typeparam name="T"></typeparam>
173         ''' <param name="x"></param>
174         ''' <returns></returns>
175         ''' 
176         <MethodImpl(MethodImplOptions.AggressiveInlining)>
177         <Extension> Public Function [ByRef](Of T)(x As T) As T
178             Return x
179         End Function
180
181         ''' <summary>
182         ''' Extension method for VisualBasic ``With`` anonymous variable syntax for determine that source reference is nothing or not?
183         ''' </summary>
184         ''' <typeparam name="T"></typeparam>
185         ''' <param name="x"></param>
186         ''' <returns></returns>
187         <MethodImpl(MethodImplOptions.AggressiveInlining)>
188         <Extension>
189         Public Function IsNothing(Of T As Class)(x As T) As Boolean
190             Return x Is Nothing
191         End Function
192 #End Region
193
194         <MethodImpl(MethodImplOptions.AggressiveInlining)>
195         <Extension>
196         Public Function AsVector(strings As IEnumerable(Of String)) As StringVector
197             Return New StringVector(strings)
198         End Function
199
200         <MethodImpl(MethodImplOptions.AggressiveInlining)>
201         Public Function list(ParamArray args As ArgumentReference()) As Dictionary(Of StringObject)
202             Return args.ToDictionary(Function(a) a.name, Function(a) a.value)
203         End Function
204
205         <MethodImpl(MethodImplOptions.AggressiveInlining)>
206         <Extension>
207         Public Function AsNumeric(list As Dictionary(Of StringObject)) As Dictionary(Of StringDouble)
208             Return list.ToDictionary(Function(t) t.Key, Function(t) CDbl(t.Value))
209         End Function
210
211         <MethodImpl(MethodImplOptions.AggressiveInlining)>
212         <Extension>
213         Public Function AsString(list As Dictionary(Of StringObject)) As Dictionary(Of StringString)
214             Return list.ToDictionary(Function(t) t.Key, Function(t) Scripting.ToString(t.Value))
215         End Function
216     End Module
217 End Namespace