From e66aa40a16cef87fb08bec80b5b1ea27237309e1 Mon Sep 17 00:00:00 2001
From: timotheyca <tim@ongoteam.yaconnect.com>
Date: Sat, 24 Jul 2021 22:07:41 +0300
Subject: [PATCH] exp, map

---
 main.py                       | 10 +++-----
 manual/main.md                | 15 ++++++++++++
 src/binary/@.bu4              |  1 +
 src/binary/lb.bu4             |  8 +++++++
 src/collections/deque/@.bu4   |  1 +
 src/collections/deque/map.bu4 | 43 +++++++++++++++++++++++++++++++++++
 src/core/@.bu4                |  1 +
 src/core/extract.bu4          |  1 +
 src/math/@.bu4                |  1 +
 src/math/exp.bu4              | 29 +++++++++++++++++++++++
 src/sys1.bu4                  |  3 ++-
 src/sys4.bu4                  |  2 +-
 12 files changed, 106 insertions(+), 9 deletions(-)
 create mode 100644 manual/main.md
 create mode 100644 src/binary/lb.bu4
 create mode 100644 src/collections/deque/map.bu4
 create mode 100644 src/core/extract.bu4
 create mode 100644 src/math/exp.bu4

diff --git a/main.py b/main.py
index 4f5ea16..edce589 100644
--- a/main.py
+++ b/main.py
@@ -1,5 +1,4 @@
 #  Copyright (c) PARRRATE T&V 2021. All rights reserved.
-import math
 import random
 
 from bu4.common_interface import with_common_interface
@@ -9,7 +8,6 @@ from bu4.evaluation.synced import synced
 from bu4.parsing.toolchain.readfile import readfile
 from timesample import TimeSample
 
-
 with TimeSample('all'):
     with TimeSample('sys0'):
         with TimeSample('compilation'):
@@ -58,10 +56,8 @@ with TimeSample('all'):
         TimeSample.print(sys3)
     with TimeSample('sys1'):
         sys1 = with_common_interface(synced(readfile('src/sys1')))
-        a_ = random.randrange(2 ** 16)
-        b_ = random.randrange(2 ** 16)
-        sys1 = sync(sys1.call(eproxy(a_)))
-        sys1 = sync(sys1.call(eproxy(b_)))
-        TimeSample.print(sys1, math.gcd(a_, b_))
+        sys1 = sync(sys1.call(eproxy(5)))
+        sys1 = sync(sys1.call(eproxy(6)))
+        TimeSample.print(sys1)
     with TimeSample('sys4'):
         TimeSample.print(with_common_interface(synced(readfile('src/sys4'))))
diff --git a/manual/main.md b/manual/main.md
new file mode 100644
index 0000000..0b810c0
--- /dev/null
+++ b/manual/main.md
@@ -0,0 +1,15 @@
+```bu4
+/[method][object]
+```
+```bu4
+/[object][virtual]
+```
+```bu4
+/
+    [accumulated]
+/
+    [accumulated]
+/
+    [accumulated]
+[accumulator]
+```
diff --git a/src/binary/@.bu4 b/src/binary/@.bu4
index 75b768f..432a94c 100644
--- a/src/binary/@.bu4
+++ b/src/binary/@.bu4
@@ -1,6 +1,7 @@
 @b!
 @01
 @zq
+@lb
 @double
 @bitwise/@
 @arithmetic/@
diff --git a/src/binary/lb.bu4 b/src/binary/lb.bu4
new file mode 100644
index 0000000..6922c71
--- /dev/null
+++ b/src/binary/lb.bu4
@@ -0,0 +1,8 @@
+{
+    (b)
+        /(zq)(lb)(hb!)
+            [lb]
+        [b]
+|
+    b_lb
+}
diff --git a/src/collections/deque/@.bu4 b/src/collections/deque/@.bu4
index 166c1fe..a781e06 100644
--- a/src/collections/deque/@.bu4
+++ b/src/collections/deque/@.bu4
@@ -4,3 +4,4 @@
 @push
 @length
 @reduce
+@map
diff --git a/src/collections/deque/map.bu4 b/src/collections/deque/map.bu4
new file mode 100644
index 0000000..9334e4a
--- /dev/null
+++ b/src/collections/deque/map.bu4
@@ -0,0 +1,43 @@
+{
+    (map)
+        /(dequeMap)
+            (isEmpty)(lPopped)(lItem)(rPopped-unused)(rItem-unused)
+                /
+                    { /[dequeMap][lPopped] | lPMapped }
+                    /(isEmptyL)(lPoppedL-unused)(lItemL-unused)(rPoppedL)(rItemL)
+                        { /[lItem][map]        | item     }
+                        /
+                            (g) /[rItemL]/</[item]/[rPoppedL][dequeLPush]>/[item]/[lPMapped]/[0] [g]
+                        /
+                            /[item][dequeSingle]
+                        [isEmptyL]
+                    [lPMapped]
+                /
+                    [dequeEmpty]
+                [isEmpty]
+        [YC]
+|
+    dequeLMap
+}
+
+{
+    (map)
+        /(dequeMap)
+            (isEmpty)(lPopped-unused)(lItem-unused)(rPopped)(rItem)
+                /
+                    { /[dequeMap][rPopped] | rPMapped }
+                    /(isEmptyR)(lPoppedR)(lItemR)(rPoppedR-unused)(rItemL-unused)
+                        { /[rItem][map]        | item     }
+                        /
+                            (g) /[item]/[rPMapped]/[lItemR]/</[item]/[lPoppedR][dequeRPush]>/[0] [g]
+                        /
+                            /[item][dequeSingle]
+                        [isEmptyR]
+                    [rPMapped]
+                /
+                    [dequeEmpty]
+                [isEmpty]
+        [YC]
+|
+    dequeRMap
+}
diff --git a/src/core/@.bu4 b/src/core/@.bu4
index 63213b1..2f64864 100644
--- a/src/core/@.bu4
+++ b/src/core/@.bu4
@@ -4,3 +4,4 @@
 @id
 @collector
 @compose
+@extract
diff --git a/src/core/extract.bu4 b/src/core/extract.bu4
new file mode 100644
index 0000000..ff70a82
--- /dev/null
+++ b/src/core/extract.bu4
@@ -0,0 +1 @@
+{ (method)(object) /[method][object] | extract }
diff --git a/src/math/@.bu4 b/src/math/@.bu4
index ac27bfe..69c2f05 100644
--- a/src/math/@.bu4
+++ b/src/math/@.bu4
@@ -1 +1,2 @@
 @gcd
+@exp
diff --git a/src/math/exp.bu4 b/src/math/exp.bu4
new file mode 100644
index 0000000..2414fe1
--- /dev/null
+++ b/src/math/exp.bu4
@@ -0,0 +1,29 @@
+{
+    (_mul)(_zq)(_lb)(_halve)(_1)
+        /(exp)
+            (_e)
+                /
+                    { /</[_e][_halve]>[exp] | _hexp}
+                    (_x)
+                        /
+                            /
+                                [_1]
+                            /
+                                [_x]
+                            /[_e][_lb]
+                        /
+                            { /[_x][_hexp] | _hexpx }
+                            /
+                                [_hexpx]
+                            /
+                                [_hexpx]
+                            [_mul]
+                        [_mul]
+                /
+                    (_x)
+                        [_1]
+                /[_e][_zq]
+        [YC]
+|
+    _exp
+}
\ No newline at end of file
diff --git a/src/sys1.bu4 b/src/sys1.bu4
index c761f63..9002367 100644
--- a/src/sys1.bu4
+++ b/src/sys1.bu4
@@ -4,6 +4,7 @@
 @ci
 
 { /[b_zq]/[b_div][_gcd] | gcd }
+{ /[b1]/[b_halve]/[b_lb]/[b_zq]/[b_mul][_exp] | exp }
 
 (a)(b)
 
@@ -12,6 +13,6 @@
             /[b][n_to_b]
         /
             /[a][n_to_b]
-        [gcd]
+        [exp]
     [b_to_n]
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
diff --git a/src/sys4.bu4 b/src/sys4.bu4
index 286fd95..374a7e6 100644
--- a/src/sys4.bu4
+++ b/src/sys4.bu4
@@ -7,6 +7,6 @@
     { /[b7]//[b1]//[b5]/[dequeEmpty][dequeLPush][dequeLPush][dequeLPush] | deque       }
 
     /
-        /</[b0]/[b_add][dequeLReduce]>[deque]
+        /</[b0]/[b_add][dequeLReduce]>//[b_double][dequeRMap]//[b_double][dequeLMap][deque]
     [b_to_n]
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""