1 #Region "Microsoft.VisualBasic::58c139604571df4a130daf3b382801ea, Microsoft.VisualBasic.Core\Language\Value\Numeric\Numeric.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 Numeric
35     
36     '         Function: Equals, GreaterThan, GreaterThanOrEquals, LessThan, LessThanOrEquals
37     '                   MaxIndex, MinIndex, NextInteger
38     
39     '     Class Precise
40     
41     
42     
43     
44     ' /********************************************************************************/
45
46 #End Region
47
48 Imports System.Runtime.CompilerServices
49
50 Namespace Language
51
52     ''' <summary>
53     ''' Defines a generalized type-specific comparison method that a value type or class
54     ''' implements to order or sort its instances.
55     ''' </summary>
56     ''' <remarks>
57     '''
58     ''' Summary:
59     '''
60     '''     Compares the current instance with another object of the same type and returns
61     '''     an integer that indicates whether the current instance precedes, follows, or
62     '''     occurs in the same position in the sort order as the other object.
63     '''
64     ''' Returns:
65     '''
66     '''     A value that indicates the relative order of the objects being compared. The
67     '''     return value has these meanings:
68     '''
69     '''     1. Value Meaning Less than zero
70     '''        This instance precedes obj in the sort order.
71     '''
72     '''     2. Zero
73     '''        This instance occurs in the same position in the sort order as obj.
74     '''
75     '''     3. Greater than zero
76     '''        This instance follows obj in the sort order.
77     '''
78     ''' Exceptions:
79     '''
80     '''   T:System.ArgumentException:
81     '''     obj is not the same type as this instance.
82     ''' </remarks>
83     Public Module Numeric
84
85 #Region "VB type char helper"
86         Public Const yes! = 1
87         Public Const no! = 0
88 #End Region
89
90         ''' <summary>
91         ''' *<see cref="Numeric.MaxIndex"/>* The max element its index in the source collection.
92         ''' </summary>
93         ''' <typeparam name="T"></typeparam>
94         ''' <param name="source"></param>
95         ''' <returns></returns>
96         <Extension>
97         Public Function MaxIndex(Of T As IComparable)(source As IEnumerable(Of T)) As Integer
98             Dim i As Integer
99             Dim max As T = source.First
100             Dim maxInd As Integer = 0
101
102             For Each x As T In source.Skip(1)
103                 i += 1
104
105                 If x.CompareTo(max) > 0 Then
106                     max = x
107                     maxInd = i
108                 End If
109             Next
110
111             Return maxInd
112         End Function
113
114         <Extension>
115         Public Function MinIndex(Of T As IComparable)(source As IEnumerable(Of T)) As Integer
116             Dim i As Integer
117             Dim min As T = source.First
118             Dim minInd As Integer = 0
119
120             For Each x As T In source.Skip(1)
121                 i += 1
122
123                 If x.CompareTo(min) < 0 Then
124                     min = x
125                     minInd = i
126                 End If
127             Next
128
129             Return minInd
130         End Function
131
132         ''' <summary>
133         ''' =
134         ''' </summary>
135         ''' <typeparam name="T"></typeparam>
136         ''' <param name="a"></param>
137         ''' <param name="b"></param>
138         ''' <returns></returns>
139         Public Function Equals(Of T As IComparable)(a As T, b As T) As Boolean
140             Return a.CompareTo(b) = 0
141         End Function
142
143         ''' <summary>
144         ''' &lt;
145         ''' </summary>
146         ''' <typeparam name="T"></typeparam>
147         ''' <param name="a"></param>
148         ''' <param name="b"></param>
149         ''' <returns></returns>
150         <Extension> Public Function LessThan(Of T As IComparable)(a As T, b As T) As Boolean
151             Return a.CompareTo(b) < 0
152         End Function
153
154         ''' <summary>
155         ''' a > b
156         ''' </summary>
157         ''' <typeparam name="T"></typeparam>
158         ''' <param name="a"></param>
159         ''' <param name="b"></param>
160         ''' <returns></returns>
161         <Extension> Public Function GreaterThan(Of T As IComparable)(a As T, b As T) As Boolean
162             Return a.CompareTo(b) > 0
163         End Function
164
165         ''' <summary>
166         ''' ``<paramref name="a"/> &lt;= <paramref name="b"/>``
167         ''' </summary>
168         ''' <typeparam name="T"></typeparam>
169         ''' <param name="a"></param>
170         ''' <param name="b"></param>
171         ''' <returns></returns>
172         <Extension> Public Function LessThanOrEquals(Of T As IComparable)(a As T, b As T) As Boolean
173             Return a.LessThan(b) OrElse Equals(a, b)
174         End Function
175
176         ''' <summary>
177         ''' =>
178         ''' </summary>
179         ''' <typeparam name="T"></typeparam>
180         ''' <param name="a"></param>
181         ''' <param name="b"></param>
182         ''' <returns></returns>
183         <Extension> Public Function GreaterThanOrEquals(Of T As IComparable)(a As T, b As T) As Boolean
184             Return a.GreaterThan(b) OrElse Equals(a, b)
185         End Function
186
187         ''' <summary>
188         ''' <see cref="Random"/> get next integer in the specific range <paramref name="max"/>
189         ''' </summary>
190         ''' <param name="rnd"></param>
191         ''' <param name="max"></param>
192         ''' <returns></returns>
193         <Extension> Public Function NextInteger(rnd As Random, max As IntegerAs int
194             Return New int(rnd.Next(max))
195         End Function
196     End Module
197
198     Public Class Precise : Inherits Value(Of Decimal)
199
200     End Class
201 End Namespace