Skip to main content

Sophisticate Linked List

Project description

linkedit

PyPI version License: MIT

This library was created to facilitate the use of linked lists with the same ease as regular lists in Python, while presenting them in a clearer and more aesthetic way, especially for beginners in data structures.

Installation

You can install linkedit via pip:

pip install linkedit

Usage

For Non Circular Singly Linked List

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)

You Can See All Nodes Details

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], detail=True)
print(x)

Output

╒═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│ Current Value    Current Value @ddress    Next Value    Next Value @ddress   │
╞═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│ 6                0x7febe8213950           3             0x7febe8213990       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 3                0x7febe8213990           8             0x7febe82139d0       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 8                0x7febe82139d0           1             0x7febe823c110       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 1                0x7febe823c110           9             0x7febe805bd10       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 9                0x7febe805bd10           5             0x7febe805bb50       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 5                0x7febe805bb50           7             0x7febe805be50       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 7                0x7febe805be50           None (NULL)   0x959cc0 (nil/0x0)   │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ None (NULL)      0x959cc0 (nil/0x0)                                          │
╘═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

You Can Change The Addresses Base From Hex(16) To Dec(10), Oct(8) Or Bin(2)

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], detail=True, base=10)
print(x)

Output

╒═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│ Current Value    Current Value @ddress    Next Value    Next Value @ddress   │
╞═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│ 6                140217964133136          3             140217964133264      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 3                140217964133264          8             140217964133200      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 8                140217964133200          1             140217964298704      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 1                140217964298704          9             140217962282256      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 9                140217962282256          5             140217962281808      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 5                140217962281808          7             140217962282576      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 7                140217962282576          None (NULL)   9804992 (nil/0)      │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ None (NULL)      9804992 (nil/0)                                             │
╘═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

You Can Add The Items In An Orderly Ascending Or Descending Manner

ASC
from linkedit import singlyLinkedList


x = singlyLinkedList()
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

[1] -> [3] -> [5] -> [6] -> [7] -> [8] -> [9] -> None (NULL)
DESC
from linkedit import singlyLinkedList


x = singlyLinkedList(reverse=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

[9] -> [8] -> [7] -> [6] -> [5] -> [3] -> [1] -> None (NULL)

You Can Check If The Linked List Is Empty Or Not

from linkedit import singlyLinkedList


x = singlyLinkedList()
print(x.isEmpty())

Output

True

You Can Do Right / Left Shifting

Right Shifting
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x >> 3
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
[9] -> [5] -> [7] -> [6] -> [3] -> [8] -> [1] -> None (NULL)
Left Shifting
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x << 3
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
[1] -> [9] -> [5] -> [7] -> [6] -> [3] -> [8] -> None (NULL)

You Can Insert A New Value In The First Of Linked List Directely With prepend

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x.prepend(0)
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
[0] -> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)

You Can Change From Non Circular To Circular

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x.set_circular()
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -

You Can Change From Singly To Doubly

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x = x.to_doubly()
print(x)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)

You Can Create A Dictionary From The Linked List

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])
y = x.to_dict()
print(x)
print(y)

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)
{6: {'current value @ddress': '0x7f64a3e13910', 'next value': 3, 'next value @ddress': '0x7f64a3e13a10'}, 3: {'current value @ddress': '0x7f64a3e13a10', 'next value': 8, 'next value @ddress': '0x7f64a3e13a50'}, 8: {'current value @ddress': '0x7f64a3e13a50', 'next value': 1, 'next value @ddress': '0x7f64a3e3c190'}, 1: {'current value @ddress': '0x7f64a3e3c190', 'next value': 9, 'next value @ddress': '0x7f64a3c1bc50'}, 9: {'current value @ddress': '0x7f64a3c1bc50', 'next value': 5, 'next value @ddress': '0x7f64a3c1ba90'}, 5: {'current value @ddress': '0x7f64a3c1ba90', 'next value': 7, 'next value @ddress': '0x7f64a3c1bd90'}, 7: {'current value @ddress': '0x7f64a3c1bd90', 'next value': None, 'next value @ddress': '0x959cc0'}}

For Circular Singly Linked List

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -

With All Nodes Details

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True, detail=True)
print(x)

Output

╒═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│   Current Value  Current Value @ddress      Next Value  Next Value @ddress   │
╞═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│               6  0x7fbe38bf3ad0                      3  0x7fbe38bf3b50       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               3  0x7fbe38bf3b50                      8  0x7fbe38bf3b10       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               8  0x7fbe38bf3b10                      1  0x7fbe38c07fd0       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               1  0x7fbe38c07fd0                      9  0x7fbe38a07c50       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               9  0x7fbe38a07c50                      5  0x7fbe38a07a90       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               5  0x7fbe38a07a90                      7  0x7fbe38a07d90       │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               7  0x7fbe38a07d90                      6  0x7fbe38bf3ad0       │
╘═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

With Dec(10) Base

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True, detail=True, base=10)
print(x)

Output

╒═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│   Current Value    Current Value @ddress    Next Value    Next Value @ddress │
╞═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│               6          140374800546256             3       140374800546448 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               3          140374800546448             8       140374800546192 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               8          140374800546192             1       140374800629712 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               1          140374800629712             9       140374798531664 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               9          140374798531664             5       140374798531216 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               5          140374798531216             7       140374798531984 │
├─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│               7          140374798531984             6       140374800546256 │
╘═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

Adding Items In An Orderly Ascending And Descending Manner

ASC
from linkedit import singlyLinkedList


x = singlyLinkedList(circular=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

> [1] -> [3] -> [5] -> [6] -> [7] -> [8] -> [9] -
DESC
from linkedit import singlyLinkedList


x = singlyLinkedList(circular=True, reverse=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

> [9] -> [8] -> [7] -> [6] -> [5] -> [3] -> [1] -

Checking If The Linked List Is Empty Or Not

from linkedit import singlyLinkedList


x = singlyLinkedList(circular=True)
print(x.isEmpty())

Output

True

Do A Right / Left Shifting

Right Shifting
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x >> 3
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
> [9] -> [5] -> [7] -> [6] -> [3] -> [8] -> [1] -
Left Shifting
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x << 3
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
> [1] -> [9] -> [5] -> [7] -> [6] -> [3] -> [8] -

Inserting A New Value In The First Of The Linked List Directely Using prepend

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x.prepend(0)
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
> [0] -> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -

You Can Change From Circular To Non Circular

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x.set_non_circular()
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)

Changing From Singly To Doubly

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x = x.to_doubly()
print(x)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=

Creating A Dictionary From The Linked List

from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
y = x.to_dict()
print(x)
print(y)

Output

> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -
{6: {'current value @ddress': '0x7f2ffda139d0', 'next value': 3, 'next value @ddress': '0x7f2ffda13a90'}, 3: {'current value @ddress': '0x7f2ffda13a90', 'next value': 8, 'next value @ddress': '0x7f2ffda13990'}, 8: {'current value @ddress': '0x7f2ffda13990', 'next value': 1, 'next value @ddress': '0x7f2ffda3c1d0'}, 1: {'current value @ddress': '0x7f2ffda3c1d0', 'next value': 9, 'next value @ddress': '0x7f2ffd81bb90'}, 9: {'current value @ddress': '0x7f2ffd81bb90', 'next value': 5, 'next value @ddress': '0x7f2ffd81b9d0'}, 5: {'current value @ddress': '0x7f2ffd81b9d0', 'next value': 7, 'next value @ddress': '0x7f2ffd81bcd0'}, 7: {'current value @ddress': '0x7f2ffd81bcd0', 'next value': 6, 'next value @ddress': '0x7f2ffda139d0'}}

Advanced Usage

You Can Loop Over All Linked List Values With A Time Complexity Of O(n)
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])


# Forward
node = x.node(0)  # Or x.head
for _ in range(len(x)):
    print(f"[{node.get_data()}]", end=" -> None\n" if node == x.tail else " -> ")
    node = node.next_node()

Output

[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None
You Can Create A Dict Of Nodes Objects From The Linked List
from linkedit import singlyLinkedList


x = singlyLinkedList([6, 3, 8, 1, 9, 5, 7])


nodes_object_list = x.to_dict(node=True)
print(nodes_object_list)

Output

{6: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d613c10>, 'next node value': 3, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d613c90>}, 3: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d613c90>, 'next node value': 8, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d613c50>}, 8: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d613c50>, 'next node value': 1, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d63c450>}, 1: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d63c450>, 'next node value': 9, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41bd10>}, 9: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41bd10>, 'next node value': 5, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41bb50>}, 5: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41bb50>, 'next node value': 7, 'next node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41be50>}, 7: {'current node': <linkedit.singlyLinkedListNode object at 0x7f0b6d41be50>, 'next node value': None, 'next node': None}}

For Non Circular Doubly Linked List

from linkedit import doublyLinkedList

x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)

With All Nodes Details

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], detail=True)
print(x)

Output

╒══════════════════╤══════════════════════════╤═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│ Previous Value    Previous Value @ddress    Current Value    Current Value @ddress    Next Value    Next Value @ddress   │
╞══════════════════╪══════════════════════════╪═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│                                             None (NULL)      0x959cc0 (nil/0x0)                                          │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ None (NULL)       0x959cc0 (nil/0x0)        6                0x7effd8613950           3             0x7effd8613990       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 6                 0x7effd8613950            3                0x7effd8613990           8             0x7effd86139d0       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 3                 0x7effd8613990            8                0x7effd86139d0           1             0x7effd863c110       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 8                 0x7effd86139d0            1                0x7effd863c110           9             0x7effd845bd10       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 1                 0x7effd863c110            9                0x7effd845bd10           5             0x7effd845bb50       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 9                 0x7effd845bd10            5                0x7effd845bb50           7             0x7effd845be50       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 5                 0x7effd845bb50            7                0x7effd845be50           None (NULL)   0x959cc0 (nil/0x0)   │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                                             None (NULL)      0x959cc0 (nil/0x0)                                          │
╘══════════════════╧══════════════════════════╧═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

With Dec(10) Base

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], detail=True, base=10)
print(x)

Output

╒══════════════════╤══════════════════════════╤═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│ Previous Value    Previous Value @ddress    Current Value    Current Value @ddress    Next Value    Next Value @ddress   │
╞══════════════════╪══════════════════════════╪═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│                                             None (NULL)      9804992 (nil/0)                                             │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ None (NULL)       9804992 (nil/0)           6                140107643451856          3             140107643451984      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 6                 140107643451856           3                140107643451984          8             140107643451920      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 3                 140107643451984           8                140107643451920          1             140107643617424      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 8                 140107643451920           1                140107643617424          9             140107641601424      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 1                 140107643617424           9                140107641601424          5             140107641600976      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 9                 140107641601424           5                140107641600976          7             140107641601744      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│ 5                 140107641600976           7                140107641601744          None (NULL)   9804992 (nil/0)      │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                                             None (NULL)      9804992 (nil/0)                                             │
╘══════════════════╧══════════════════════════╧═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

Adding The Items In An Orderly Ascending And Descending Manner

ASC
from linkedit import doublyLinkedList


x = doublyLinkedList()
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

None (NULL) <- [1] <=> [3] <=> [5] <=> [6] <=> [7] <=> [8] <=> [9] -> None (NULL)
DESC
from linkedit import doublyLinkedList


x = doublyLinkedList(reverse=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

None (NULL) <- [9] <=> [8] <=> [7] <=> [6] <=> [5] <=> [3] <=> [1] -> None (NULL)

Checking If The Linked List Is Empty Or Not

from linkedit import doublyLinkedList


x = doublyLinkedList()
print(x.isEmpty())

Output

True

Do Right / Left Shifting

Right Shifting
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x >> 3
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
None (NULL) <- [9] <=> [5] <=> [7] <=> [6] <=> [3] <=> [8] <=> [1] -> None (NULL)
Left Shifting
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x << 3
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
None (NULL) <- [1] <=> [9] <=> [5] <=> [7] <=> [6] <=> [3] <=> [8] -> None (NULL)

Inserting A New Value In The First Of Linked List Directely Using prepend

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x.prepend(0)
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
None (NULL) <- [0] <=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)

Changing From Non Circular To Circular

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x.set_circular()
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=

You Can Change From Doubly To Singly

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
print(x)
x = x.to_singly()
print(x)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
[6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -> None (NULL)

Creating A Dictionary From The Linked List

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])
y = x.to_dict()
print(x)
print(y)

Output

None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)
{6: {'current value @ddress': '0x7fb9c6117990', 'next value': 3, 'next value @ddress': '0x7fb9c6117a90'}, 3: {'current value @ddress': '0x7fb9c6117a90', 'next value': 8, 'next value @ddress': '0x7fb9c6117ad0'}, 8: {'current value @ddress': '0x7fb9c6117ad0', 'next value': 1, 'next value @ddress': '0x7fb9c6140250'}, 1: {'current value @ddress': '0x7fb9c6140250', 'next value': 9, 'next value @ddress': '0x7fb9c5f23b10'}, 9: {'current value @ddress': '0x7fb9c5f23b10', 'next value': 5, 'next value @ddress': '0x7fb9c5f23950'}, 5: {'current value @ddress': '0x7fb9c5f23950', 'next value': 7, 'next value @ddress': '0x7fb9c5f23c50'}, 7: {'current value @ddress': '0x7fb9c5f23c50', 'next value': None, 'next value @ddress': '0x959cc0'}}

For Circular Doubly Linked List

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=

With All Nodes Details

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True, detail=True)
print(x)

Output

╒══════════════════╤══════════════════════════╤═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│   Previous Value  Previous Value @ddress      Current Value  Current Value @ddress      Next Value  Next Value @ddress   │
╞══════════════════╪══════════════════════════╪═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│                7  0x7ff7a725be10                          6  0x7ff7a7413ad0                      3  0x7ff7a7413b50       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                6  0x7ff7a7413ad0                          3  0x7ff7a7413b50                      8  0x7ff7a7413b10       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                3  0x7ff7a7413b50                          8  0x7ff7a7413b10                      1  0x7ff7a7427fd0       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                8  0x7ff7a7413b10                          1  0x7ff7a7427fd0                      9  0x7ff7a725bcd0       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                1  0x7ff7a7427fd0                          9  0x7ff7a725bcd0                      5  0x7ff7a725bb10       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                9  0x7ff7a725bcd0                          5  0x7ff7a725bb10                      7  0x7ff7a725be10       │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                5  0x7ff7a725bb10                          7  0x7ff7a725be10                      6  0x7ff7a7413ad0       │
╘══════════════════╧══════════════════════════╧═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

With Dec(10) Base

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True, detail=True, base=10)
print(x)

Output

╒══════════════════╤══════════════════════════╤═════════════════╤═════════════════════════╤══════════════╤══════════════════════╕
│   Previous Value    Previous Value @ddress    Current Value    Current Value @ddress    Next Value    Next Value @ddress │
╞══════════════════╪══════════════════════════╪═════════════════╪═════════════════════════╪══════════════╪══════════════════════╡
│                7           140070320684368                6          140070322534992             3       140070322535184 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                6           140070322534992                3          140070322535184             8       140070322534928 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                3           140070322535184                8          140070322534928             1       140070322700432 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                8           140070322534928                1          140070322700432             9       140070320684048 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                1           140070322700432                9          140070320684048             5       140070320683600 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                9           140070320684048                5          140070320683600             7       140070320684368 │
├──────────────────┼──────────────────────────┼─────────────────┼─────────────────────────┼──────────────┼──────────────────────┤
│                5           140070320683600                7          140070320684368             6       140070322534992 │
╘══════════════════╧══════════════════════════╧═════════════════╧═════════════════════════╧══════════════╧══════════════════════╛

Adding The Items In An Orderly Ascending And Descending Manner

ASC
from linkedit import doublyLinkedList


x = doublyLinkedList(circular=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

=> [1] <=> [3] <=> [5] <=> [6] <=> [7] <=> [8] <=> [9] <=
DESC
from linkedit import doublyLinkedList


x = doublyLinkedList(circular=True, reverse=True)
x.add(6)
x.add(3)
x.add(8)
x.add(1)
x.add(9)
x.add(5)
x.add(7)
print(x)

Output

=> [9] <=> [8] <=> [7] <=> [6] <=> [5] <=> [3] <=> [1] <=

Checking If The Linked List Is Empty Or Not

from linkedit import doublyLinkedList


x = doublyLinkedList(circular=True)
print(x.isEmpty())

Output

True

Do Right / Left Shifting

Right Shifting
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x >> 3
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
=> [9] <=> [5] <=> [7] <=> [6] <=> [3] <=> [8] <=> [1] <=
Left Shifting
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x << 3
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
=> [1] <=> [9] <=> [5] <=> [7] <=> [6] <=> [3] <=> [8] <=

Inserting A New Value In The First Of Linked List Directely Using prepend

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x.prepend(0)
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
=> [0] <=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=

Changing From Circular To Non Circular

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x.set_non_circular()
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
None (NULL) <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None (NULL)

You Can Change From Doubly To Singly

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
print(x)
x = x.to_singly()
print(x)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
> [6] -> [3] -> [8] -> [1] -> [9] -> [5] -> [7] -

Creating A Dictionary From The Linked List

from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7], circular=True)
y = x.to_dict()
print(x)
print(y)

Output

=> [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] <=
{6: {'current value @ddress': '0x7f5366a139d0', 'next value': 3, 'next value @ddress': '0x7f5366a13a90'}, 3: {'current value @ddress': '0x7f5366a13a90', 'next value': 8, 'next value @ddress': '0x7f5366a13990'}, 8: {'current value @ddress': '0x7f5366a13990', 'next value': 1, 'next value @ddress': '0x7f5366a3c1d0'}, 1: {'current value @ddress': '0x7f5366a3c1d0', 'next value': 9, 'next value @ddress': '0x7f536681bb90'}, 9: {'current value @ddress': '0x7f536681bb90', 'next value': 5, 'next value @ddress': '0x7f536681b9d0'}, 5: {'current value @ddress': '0x7f536681b9d0', 'next value': 7, 'next value @ddress': '0x7f536681bcd0'}, 7: {'current value @ddress': '0x7f536681bcd0', 'next value': 6, 'next value @ddress': '0x7f5366a139d0'}}

Advanced Usage

Looping Over All Linked List Values With A Time Complexity Of O(n)
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])


print("Forward : ")
node = x.node(0)  # Or x.head
print("None <- ", end="")
for _ in range(len(x)):
    print(f"[{node.get_data()}]", end=" -> None\n" if node == x.tail else " <=> ")
    node = node.next_node()


print("Backward : ")
node = x.node(-1)  # Or x.tail
print("None <- ", end="")
for _ in range(len(x)):
    print(f"[{node.get_data()}]", end=" -> None\n" if node == x.head else " <=> ")
    node = node.prev_node()

Output

Forward : 
None <- [6] <=> [3] <=> [8] <=> [1] <=> [9] <=> [5] <=> [7] -> None
Backward : 
None <- [7] <=> [5] <=> [9] <=> [1] <=> [8] <=> [3] <=> [6] -> None
You Can Create A Dict Of Nodes Objects From The Linked List
from linkedit import doublyLinkedList


x = doublyLinkedList([6, 3, 8, 1, 9, 5, 7])


nodes_object_list = x.to_dict(node=True)
print(nodes_object_list)

Output

{6: {'prev node value': None, 'prev node @ddress': None, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff5514d79d0>, 'next node value': 3, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a50>}, 3: {'prev node value': 6, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff5514d79d0>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a50>, 'next node value': 8, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a10>}, 8: {'prev node value': 3, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a50>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a10>, 'next node value': 1, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff55128fe50>}, 1: {'prev node value': 8, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff5514d7a10>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff55128fe50>, 'next node value': 9, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff55128fc90>}, 9: {'prev node value': 1, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff55128fe50>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff55128fc90>, 'next node value': 5, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff55128ff90>}, 5: {'prev node value': 9, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff55128fc90>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff55128ff90>, 'next node value': 7, 'next node': <linkedit.doublyLinkedListNode object at 0x7ff55128fed0>}, 7: {'prev node value': 5, 'prev node @ddress': <linkedit.doublyLinkedListNode object at 0x7ff55128ff90>, 'current node': <linkedit.doublyLinkedListNode object at 0x7ff55128fed0>, 'next node value': None, 'next node': None}}

Important Note

You can use all list methods with singly / doubly linked list sush as [append, clear, copy, count, extand, insert, index, pop, remove, reverse, sort], and all operations you can do with a list can do with this linked list.

For Non Circular Orthogonal Linked List

from linkedit import orthogonalLinkedList


x = orthogonalLinkedList([[6, 3, 8], [1, 9, 5], [7, 2, 4]])
print(x)

Output

╒══════╤══════╤══════╤══════╤══════╕
│       None  None  None       │
├──────┼──────┼──────┼──────┼──────┤
│ None  6     3     8     None │
├──────┼──────┼──────┼──────┼──────┤
│ None  1     9     5     None │
├──────┼──────┼──────┼──────┼──────┤
│ None  7     2     4     None │
├──────┼──────┼──────┼──────┼──────┤
│       None  None  None       │
╘══════╧══════╧══════╧══════╧══════╛

With All Nodes Details

from linkedit import orthogonalLinkedList


x = orthogonalLinkedList([[6, 3, 8], [1, 9, 5], [7, 2, 4]], detail=True)
print(x)

Output

╒══════╤════════════════╤════════════╤════════════════╤═══════════╤════════════════╤════════╤════════════════╤════════╤════════════════╕
│ Up    Up @            Previous    Previous @        Current  Current @       Down    Down @          Next    Next @         │
╞══════╪════════════════╪════════════╪════════════════╪═══════════╪════════════════╪════════╪════════════════╪════════╪════════════════╡
│ None  0x959cc0        None        0x959cc0                6  0x7f20d0213250  1       0x7f20d0213cd0  3       0x7f20d0213c50 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ None  0x959cc0        6           0x7f20d0213250          3  0x7f20d0213c50  9       0x7f20d023c090  8       0x7f20d0213c90 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ None  0x959cc0        3           0x7f20d0213c50          8  0x7f20d0213c90  5       0x7f20d005bcd0  None    0x959cc0       │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 6     0x7f20d0213250  None        0x959cc0                1  0x7f20d0213cd0  7       0x7f20d005bb10  9       0x7f20d023c090 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 3     0x7f20d0213c50  1           0x7f20d0213cd0          9  0x7f20d023c090  2       0x7f20d005be10  5       0x7f20d005bcd0 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 8     0x7f20d0213c90  9           0x7f20d023c090          5  0x7f20d005bcd0  4       0x7f20d005bd50  None    0x959cc0       │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 1     0x7f20d0213cd0  None        0x959cc0                7  0x7f20d005bb10  None    0x959cc0        2       0x7f20d005be10 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 9     0x7f20d023c090  7           0x7f20d005bb10          2  0x7f20d005be10  None    0x959cc0        4       0x7f20d005bd50 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│ 5     0x7f20d005bcd0  2           0x7f20d005be10          4  0x7f20d005bd50  None    0x959cc0        None    0x959cc0       │
╘══════╧════════════════╧════════════╧════════════════╧═══════════╧════════════════╧════════╧════════════════╧════════╧════════════════╛

For Circular Orthogonal Linked List

from linkedit import orthogonalLinkedList


x = orthogonalLinkedList([[6, 3, 8], [1, 9, 5], [7, 2, 4]], circular=True)
print(x)

Output

╒═══╤═══╤═══╕
│ 6  3  8 │
├───┼───┼───┤
│ 1  9  5 │
├───┼───┼───┤
│ 7  2  4 │
╘═══╧═══╧═══╛

with All Nodes Details

from linkedit import orthogonalLinkedList


x = orthogonalLinkedList([[6, 3, 8], [1, 9, 5], [7, 2, 4]], circular=True, detail=True)
print(x)

Output

╒══════╤════════════════╤════════════╤════════════════╤═══════════╤════════════════╤════════╤════════════════╤════════╤════════════════╕
│   Up  Up @              Previous  Previous @        Current  Current @         Down  Down @            Next  Next @         │
╞══════╪════════════════╪════════════╪════════════════╪═══════════╪════════════════╪════════╪════════════════╪════════╪════════════════╡
│    7  0x7f01e6153ad0           8  0x7f01e6317cd0          6  0x7f01e6316250       1  0x7f01e6317d10       3  0x7f01e6317c90 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    2  0x7f01e6153dd0           6  0x7f01e6316250          3  0x7f01e6317c90       9  0x7f01e632bfd0       8  0x7f01e6317cd0 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    4  0x7f01e6153d10           3  0x7f01e6317c90          8  0x7f01e6317cd0       5  0x7f01e6153c90       6  0x7f01e6316250 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    6  0x7f01e6316250           5  0x7f01e6153c90          1  0x7f01e6317d10       7  0x7f01e6153ad0       9  0x7f01e632bfd0 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    3  0x7f01e6317c90           1  0x7f01e6317d10          9  0x7f01e632bfd0       2  0x7f01e6153dd0       5  0x7f01e6153c90 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    8  0x7f01e6317cd0           9  0x7f01e632bfd0          5  0x7f01e6153c90       4  0x7f01e6153d10       1  0x7f01e6317d10 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    1  0x7f01e6317d10           4  0x7f01e6153d10          7  0x7f01e6153ad0       6  0x7f01e6316250       2  0x7f01e6153dd0 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    9  0x7f01e632bfd0           7  0x7f01e6153ad0          2  0x7f01e6153dd0       3  0x7f01e6317c90       4  0x7f01e6153d10 │
├──────┼────────────────┼────────────┼────────────────┼───────────┼────────────────┼────────┼────────────────┼────────┼────────────────┤
│    5  0x7f01e6153c90           2  0x7f01e6153dd0          4  0x7f01e6153d10       8  0x7f01e6317cd0       7  0x7f01e6153ad0 │
╘══════╧════════════════╧════════════╧════════════════╧═══════════╧════════════════╧════════╧════════════════╧════════╧════════════════╛

Advanced Usage

from linkedit import orthogonalLinkedList


x = orthogonalLinkedList([[6, 3, 8], [1, 9, 5], [7, 2, 4]])


print("Printing All Data Using x.node : ")
for i in range(len(x.node)):
    for j in range(len(x.node[i])):
        print(x.node[i][j].get_data())


print("Printing All Data Using x.node And x.shape : ")
for i in range(x.shape[0]):
    for j in range(x.shape[1]):
        print(x.node[i][j].get_data())


center = x.node[1][1]
print(f"All Neighbors Of The Center Node {center.get_data()} : ")
print(f"up : {center.up_node().get_data()}")
print(f"prev : {center.prev_node().get_data()}")
print(f"down : {center.down_node().get_data()}")
print(f"next : {center.next_node().get_data()}")

Output

Printing All Data Using x.node : 
6
3
8
1
9
5
7
2
4
Printing All Data Using x.node And x.shape : 
6
3
8
1
9
5
7
2
4
All Neighbors Of The Center Node 9 : 
up : 3
prev : 1
down : 2
next : 5

License

This project is licensed under the MIT LICENSE - see the LICENSE for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

linkedit-1.1.3.tar.gz (28.7 kB view details)

Uploaded Source

Built Distribution

linkedit-1.1.3-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file linkedit-1.1.3.tar.gz.

File metadata

  • Download URL: linkedit-1.1.3.tar.gz
  • Upload date:
  • Size: 28.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.2

File hashes

Hashes for linkedit-1.1.3.tar.gz
Algorithm Hash digest
SHA256 2f1d164748e4ed6c629444fba5c64229cfa923418feb2c9f4d602f4e93bd014c
MD5 23ecbec5cfb33dc4d7f187e050ecf125
BLAKE2b-256 ea579b969b529c6053d73befd13bb8367895af37b82f7805db556593e9fcd258

See more details on using hashes here.

File details

Details for the file linkedit-1.1.3-py3-none-any.whl.

File metadata

  • Download URL: linkedit-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 18.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.2

File hashes

Hashes for linkedit-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 fff4eacb1b12321da6b77333631690506cf8fef2f1f09e6583a9ec6d2c1af5df
MD5 1c75b8da087f0d46a0d6c2cacdcd5e97
BLAKE2b-256 2e78fe6b718533b5714ef990c5a954e9cd5be432237ca03278e2ee913125b6d1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page