1 #Region "Microsoft.VisualBasic::3587265eea5511f063323d0233fa5c6c, Microsoft.VisualBasic.Core\ComponentModel\Algorithm\BinaryTree\Enumerable.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 Enumerable
35     
36     '         Function: PopulateNodes, PopulateSequence, (+2 Overloads) Values
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.Runtime.CompilerServices
44
45 Namespace ComponentModel.Algorithm.BinaryTree
46
47     Public Module Enumerable
48
49         ''' <summary>
50         ''' Populate an ASC sortted sequence from this binary tree 
51         ''' 
52         ''' ```
53         ''' left -> me -> right
54         ''' ```
55         ''' </summary>
56         ''' <typeparam name="K"></typeparam>
57         ''' <typeparam name="V"></typeparam>
58         ''' <param name="tree"></param>
59         ''' <returns></returns>
60         ''' 
61         <MethodImpl(MethodImplOptions.AggressiveInlining)>
62         <Extension>
63         Public Function PopulateSequence(Of K, V)(tree As BinaryTree(Of K, V)) As IEnumerable(Of Map(Of K, V))
64             Return tree.PopulateNodes.Select(Function(n) New Map(Of K, V)(n.Key, n.Value))
65         End Function
66
67         <Extension>
68         Public Iterator Function PopulateNodes(Of K, V)(tree As BinaryTree(Of K, V)) As IEnumerable(Of BinaryTree(Of K, V))
69             If Not tree.Left Is Nothing Then
70                 For Each node In tree.Left.PopulateNodes
71                     Yield node
72                 Next
73             End If
74
75             Yield tree
76
77             If Not tree.Right Is Nothing Then
78                 For Each node In tree.Right.PopulateNodes
79                     Yield node
80                 Next
81             End If
82         End Function
83
84         <MethodImpl(MethodImplOptions.AggressiveInlining)>
85         <Extension>
86         Public Function Values(Of K, V)(tree As BinaryTree(Of K, V)) As IEnumerable(Of V)
87             Return tree.PopulateNodes.Values
88         End Function
89
90         <MethodImpl(MethodImplOptions.AggressiveInlining)>
91         <Extension>
92         Public Function Values(Of K, V)(nodes As IEnumerable(Of BinaryTree(Of K, V))) As IEnumerable(Of V)
93             Return nodes.Select(Function(n) n.Value)
94         End Function
95     End Module
96 End Namespace