Skip to content

Commit 1ef66e0

Browse files
committed
add quicksort.py/bend without translating Python
1 parent 4bfc867 commit 1ef66e0

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

examples/quicksort.bend

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
type MyTree = Leaf | (Node lft val rgt)
2+
3+
# Parallel QuickSort
4+
(Sort List/Nil) = MyTree/Leaf
5+
(Sort (List/Cons head tail)) =
6+
((Part head tail) λmin λmax
7+
let lft = (Sort min)
8+
let rgt = (Sort max)
9+
(MyTree/Node lft head rgt))
10+
11+
# Partitions a list in two halves, less-than-p and greater-than-p
12+
(Part p List/Nil) = λt (t List/Nil List/Nil)
13+
(Part p (List/Cons head tail)) = (Push (> head p) head (Part p tail))
14+
15+
# Pushes a value to the first or second list of a pair
16+
(Push 0 x pair) = (pair λmin λmax λp (p (List/Cons x min) max))
17+
(Push _ x pair) = (pair λmin λmax λp (p min (List/Cons x max)))
18+
19+
# Generates a random list with xorshift
20+
(Rnd 0 state) = List/Nil
21+
(Rnd n state) =
22+
let state = (^ state (<< state 13))
23+
let state = (^ state (>> state 17))
24+
let state = (^ state (<< state 5))
25+
(List/Cons state (Rnd (- n 1) state))
26+
27+
# Sums all elements in a concatenation tree
28+
(Sum MyTree/Leaf) = 0
29+
(Sum (MyTree/Node lft val rgt)) = (+ val (+ (Sum lft) (Sum rgt)))
30+
31+
# Sorts and sums n random numbers
32+
(Main) =
33+
(Sum (Sort (Rnd 0x100 1)))
34+
35+
# Use an argument from cli
36+
# (Main n) = (Sum (Sort (Rnd (<< 1 n) 1)))

examples/quicksort.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from typing import TypeVar, Generic
2+
from dataclasses import dataclass
3+
import random
4+
5+
T = TypeVar("T")
6+
7+
# --> Our Target
8+
9+
# import benda
10+
# from benda import u24
11+
12+
# book = benda.load_book_from_file("./quicksort.bend")
13+
# List_Nil = book.adts.List.Nil
14+
# List_Cons = book.adts.List.Cons
15+
# MyTree_Leaf = book.adts.MyTree.Leaf
16+
# MyTree_Node = book.adts.MyTree.Node
17+
18+
19+
# -> Mock
20+
21+
u24 = int
22+
23+
24+
@dataclass
25+
class List_Nil:
26+
pass
27+
28+
29+
@dataclass
30+
class List_Cons(Generic[T]):
31+
value: T
32+
tail: "List[T]"
33+
34+
35+
List = List_Nil | List_Cons[T]
36+
37+
38+
@dataclass
39+
class MyTree_Leaf:
40+
pass
41+
42+
43+
@dataclass
44+
class MyTree_Node(Generic[T]):
45+
value: T
46+
left: "MyTree[T]"
47+
right: "MyTree[T]"
48+
49+
50+
MyTree = MyTree_Leaf | MyTree_Node[T]
51+
52+
53+
def gen_list(n: int, max_value: int) -> List[u24]:
54+
if n <= 0:
55+
return List_Nil()
56+
else:
57+
value = random.randint(0, max_value)
58+
return List_Cons(u24(value), gen_list(n-1, max_value))
59+
60+
61+
def print_tree(tree: MyTree[u24]):
62+
match tree:
63+
case MyTree_Leaf():
64+
pass
65+
case MyTree_Node(value, left, right):
66+
print(value)
67+
print_tree(left)
68+
print_tree(right)
69+
70+
71+
def list_to_tree(list: List[u24]) -> MyTree[u24]:
72+
match list:
73+
case List_Nil():
74+
return MyTree_Leaf()
75+
case List_Cons(value, tail):
76+
return MyTree_Node(value, MyTree_Leaf(), list_to_tree(tail))
77+
78+
79+
def mock_sum(tree: MyTree[u24]) -> u24:
80+
match tree:
81+
case MyTree_Leaf():
82+
return u24(0)
83+
case MyTree_Node(value, left, right):
84+
return value + mock_sum(left) + mock_sum(right)
85+
86+
87+
def main():
88+
numbers = gen_list(7, 1000)
89+
print(numbers)
90+
91+
# tree = benda.run(book.defs.Sort, [numbers])
92+
# tree = book.defs.Sort(numbers)
93+
94+
tree = list_to_tree(numbers)
95+
print("Values:")
96+
print_tree(tree)
97+
98+
# result = book.run(book.defs.Sum, [tree])
99+
100+
result = mock_sum(tree)
101+
print("Result:", result)
102+
103+
104+
if __name__ == "__main__":
105+
main()

0 commit comments

Comments
 (0)