aboutsummaryrefslogtreecommitdiff
path: root/challenge-094/athanasius/raku/SinglyLinkedList.rakumod
blob: 19b105cf70521c0fd236607053f3dffd5406a58c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use v6d;

###############################################################################
=begin comment

Perl Weekly Challenge 094, Task #2: Binary Tree to Linked List

=end comment
###############################################################################

#--------------------------------------#
# Copyright © 2021 PerlMonk Athanasius #
#--------------------------------------#

#==============================================================================
unit class SinglyLinkedList;
#==============================================================================

#------------------------------------------------------------------------------
my class Node
#------------------------------------------------------------------------------
{
    has Any  $.value;
    has Node $.next is rw;
}

has Node $.head is rw;

#------------------------------------------------------------------------------
submethod BUILD( :$value )
#------------------------------------------------------------------------------
{
    if $value.defined
    {
        $!head = Node.new( value => $value, next => Nil );
    }
}

#------------------------------------------------------------------------------
method append( Any $value )
#------------------------------------------------------------------------------
{
    if $value.defined && $value ne ''
    {
        my Node $new-node = Node.new( value => $value, next => Nil );

        if $!head.defined
        {
            my Node $current = $!head;

            $current = $current.next while $current.next.defined;
        
            $current.next = $new-node;
        }
        else
        {
            $!head = $new-node;
        }
    }
}

#------------------------------------------------------------------------------
method display( --> Str:D )
#------------------------------------------------------------------------------
{
    my Str $display;

    if $!head.defined
    {
        my Bool $first = True;

        loop (my Node $node = $!head; $node.defined; $node = $node.next)
        {
            $display ~= ' -> ' unless $first;
            $first    = False;
            $display ~= $node.value;
        }
    }
    else
    {
        $display = '(empty)';
    }

    return $display;
}

##############################################################################