From 3e5932b2ad50c9a30a4f9f0cd930005727f626fb Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Mon, 1 Jun 2026 07:01:25 -0500 Subject: [PATCH] Work with slim instead --- .gitea/workflows/tag.yaml | 15 ++--- Changelog.md | 3 + README.md | 6 +- Tesses.CrossLang.Shell/src/test.tcross | 1 + .../Concurrent/ConcurrentQueue.tcross | 65 +++++++++++++++++++ .../Concurrent/ConcurrentStack.tcross | 65 +++++++++++++++++++ .../src/Collections/Queue.tcross | 32 +++++++++ .../src/Collections/SequenceEquals.tcross | 24 +++++++ .../src/Collections/Stack.tcross | 33 ++++++++++ Tesses.CrossLang.Std/src/Event.tcross | 48 ++++++++++++++ .../Exception.tcross} | 10 +-- .../src/Exceptions/OutOfRangeException.tcross | 7 ++ Tesses.CrossLang.Std/src/ExecutorQueue.tcross | 42 ++++++++++++ Tesses.CrossLang.Std/src/FuncWithThis.tcross | 12 ++++ Tesses.CrossLang.Std/src/MutexLock.tcross | 19 ++++++ Tesses.CrossLang.Std/src/Result.tcross | 39 +++++++++++ Tesses.CrossLang.Std/tests/Collections.tcross | 48 ++++++++++++++ build.tcross | 31 +++++---- 18 files changed, 464 insertions(+), 36 deletions(-) create mode 100644 Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentQueue.tcross create mode 100644 Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentStack.tcross create mode 100644 Tesses.CrossLang.Std/src/Collections/Queue.tcross create mode 100644 Tesses.CrossLang.Std/src/Collections/SequenceEquals.tcross create mode 100644 Tesses.CrossLang.Std/src/Collections/Stack.tcross create mode 100644 Tesses.CrossLang.Std/src/Event.tcross rename Tesses.CrossLang.Std/src/{exception.tcross => Exceptions/Exception.tcross} (68%) create mode 100644 Tesses.CrossLang.Std/src/Exceptions/OutOfRangeException.tcross create mode 100644 Tesses.CrossLang.Std/src/ExecutorQueue.tcross create mode 100644 Tesses.CrossLang.Std/src/FuncWithThis.tcross create mode 100644 Tesses.CrossLang.Std/src/MutexLock.tcross create mode 100644 Tesses.CrossLang.Std/src/Result.tcross create mode 100644 Tesses.CrossLang.Std/tests/Collections.tcross diff --git a/.gitea/workflows/tag.yaml b/.gitea/workflows/tag.yaml index 2872551..b26d75b 100644 --- a/.gitea/workflows/tag.yaml +++ b/.gitea/workflows/tag.yaml @@ -13,23 +13,22 @@ env: jobs: build-crosslang-shell-and-cpkg: - runs-on: ubuntu-latest + runs-on: arch-builder steps: - uses: actions/checkout@v4 - run: | + wget -O /root/repository.key https://git.tesses.org/api/packages/tesses50/arch/repository.key + pacman-key --add /root/repository.key + printf "[tesses50.git.tesses.org]\nSigLevel = Optional TrustAll\nServer = https://git.tesses.org/api/packages/tesses50/arch/core/\$arch\n" >> /etc/pacman.conf + pacman --noconfirm -Sy crosslang cd vscode-extension npm install npm install -g typescript npm install -g @vscode/vsce vsce package cd .. - wget -O /usr/local/bin/crosslang https://redirect.tesses.net/cl-slim-x86_64-linux-musl - chmod 755 /usr/local/bin/crosslang - ln -s /usr/local/bin/crosslang /usr/local/bin/crossc - ln -s /usr/local/bin/crosslang /usr/local/bin/crossint - ln -s /usr/local/bin/crosslang /usr/local/bin/crossvm - crossint ./build.tcross pack - crossint ./build.tcross install + crosslang int ./build.tcross pack + crosslang int ./build.tcross install mkdir -p artifacts cp Tesses.CrossLang.ShellPackage-*.crvm artifacts/ShellPackage.crvm cp Tesses.CrossLang.PackageServer/bin/Tesses.CrossLang.PackageServer-*.crvm artifacts/CPKG.crvm diff --git a/Changelog.md b/Changelog.md index 99364d7..a206fb6 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,8 @@ ## Changelog +## v0.0.3 +Work with slim instead + ## v0.0.2 Add the templates for npm diff --git a/README.md b/README.md index eaae3ed..2868716 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,15 @@ # To Build ```bash -crossint ./build.tcross +crosslang int ./build.tcross ``` # To Install ```bash -crossint ./build.tcross install +crosslang int ./build.tcross install ``` # To Pack ```bash -crossint ./build.tcross pack +crosslang int ./build.tcross pack ``` \ No newline at end of file diff --git a/Tesses.CrossLang.Shell/src/test.tcross b/Tesses.CrossLang.Shell/src/test.tcross index f093c6d..cd7d7e1 100644 --- a/Tesses.CrossLang.Shell/src/test.tcross +++ b/Tesses.CrossLang.Shell/src/test.tcross @@ -27,6 +27,7 @@ class ExpectObj { this.SetRes(this.left == right, $"{this.left} is not equal to {right}"); } } + public LessThan(right) { if(this.inverted) diff --git a/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentQueue.tcross b/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentQueue.tcross new file mode 100644 index 0000000..bc70225 --- /dev/null +++ b/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentQueue.tcross @@ -0,0 +1,65 @@ +class ConcurrentQueue +{ + private mtx = new Mutex(); + + private queue = new Queue(); + + public Enqueue(val) + { + mtx.Lock(); + queue.Enqueue(val); + mtx.Unlock(); + + } + + public Dequeue() + { + mtx.Lock(); + const val = queue.Dequeue(); + mtx.Unlock(); + + return val; + } + public Peek() + { + mtx.Lock(); + const val = queue.Peek(); + mtx.Unlock(); + + return val; + } + + public getCount() + { + mtx.Lock(); + const val = queue.Count; + mtx.Unlock(); + + return val; + } + public getLength() + { + mtx.Lock(); + const val = queue.Length; + mtx.Unlock(); + + return val; + } + + public ToList() + { + + mtx.Lock(); + + const ittr = new Queryable(queue); + const ls = ittr.ToList(); + + mtx.Unlock(); + return ls; + } + + public GetEnumerator() + { + return ToList().GetEnumerator(); + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentStack.tcross b/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentStack.tcross new file mode 100644 index 0000000..fe0287b --- /dev/null +++ b/Tesses.CrossLang.Std/src/Collections/Concurrent/ConcurrentStack.tcross @@ -0,0 +1,65 @@ +class ConcurrentStack +{ + private mtx = new Mutex(); + + private stack = new Stack(); + + public Push(val) + { + mtx.Lock(); + stack.Push(val); + mtx.Unlock(); + + } + + public Pop() + { + mtx.Lock(); + const val = stack.Pop(); + mtx.Unlock(); + + return val; + } + public Top() + { + mtx.Lock(); + const val = stack.Top(); + mtx.Unlock(); + + return val; + } + + public getCount() + { + mtx.Lock(); + const val = stack.Count; + mtx.Unlock(); + + return val; + } + public getLength() + { + mtx.Lock(); + const val = stack.Length; + mtx.Unlock(); + + return val; + } + + public ToList() + { + + mtx.Lock(); + + const ittr = new Queryable(stack); + const ls = ittr.ToList(); + + mtx.Unlock(); + return ls; + } + + public GetEnumerator() + { + return ToList().GetEnumerator(); + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Collections/Queue.tcross b/Tesses.CrossLang.Std/src/Collections/Queue.tcross new file mode 100644 index 0000000..cf1ec1d --- /dev/null +++ b/Tesses.CrossLang.Std/src/Collections/Queue.tcross @@ -0,0 +1,32 @@ +class Queue +{ + private items = []; + + public Enqueue(val) + { + items.Add(val); + } + + public Dequeue() + { + if(items.Count == 0) return null; + const val = items[0]; + items.RemoveAt(0); + + return val; + } + + public Peek() + { + if(items.Count == 0) return null; + return items[0]; + } + + public GetEnumerator() + { + return items.GetEnumerator(); + } + + public getCount() items.Count; + public getLength() items.Length; +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Collections/SequenceEquals.tcross b/Tesses.CrossLang.Std/src/Collections/SequenceEquals.tcross new file mode 100644 index 0000000..1dae103 --- /dev/null +++ b/Tesses.CrossLang.Std/src/Collections/SequenceEquals.tcross @@ -0,0 +1,24 @@ +func SequenceEquals(a,b) +{ + const ittra = a.GetEnumerator(); + const ittrb = b.GetEnumerator(); + + defer { + ittra.Dispose(); + ittrb.Dispose(); + } + + while(true) { + const hasa = ittra.MoveNext(); + const hasb = ittrb.MoveNext(); + + if(hasa != hasb) return false; + if(hasa) + { + if(!(hasa.Current == hasb.Current)) return false; + } + else break; + } + + return true; +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Collections/Stack.tcross b/Tesses.CrossLang.Std/src/Collections/Stack.tcross new file mode 100644 index 0000000..4513cea --- /dev/null +++ b/Tesses.CrossLang.Std/src/Collections/Stack.tcross @@ -0,0 +1,33 @@ +class Stack +{ + private items = []; + + public Push(val) + { + items.Insert(0, val); + } + + public Pop() + { + if(items.Count == 0) return null; + const val = items[0]; + items.RemoveAt(0); + return val; + } + + public Top() + { + if(items.Count == 0) return null; + return items[0]; + } + + public getCount() items.Count; + + + public getLength() items.Length; + + public GetEnumerator() + { + return items.GetEnumerator(); + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Event.tcross b/Tesses.CrossLang.Std/src/Event.tcross new file mode 100644 index 0000000..57dd13e --- /dev/null +++ b/Tesses.CrossLang.Std/src/Event.tcross @@ -0,0 +1,48 @@ +class Event { + private mtx = new Mutex(); + private cb = []; + public Event() + { + + } + + public Invoke(sender,e) + { + mtx.Lock(); + each(var item : cb) + { + item(sender,e); + } + mtx.Unlock(); + } + + public Subscribe(val) + { + mtx.Lock(); + cb.Add(val); + mtx.Unlock(); + } + + public Unsubscribe(val) + { + mtx.Lock(); + cb.Remove(val); + mtx.Unlock(); + } + + public operator+(val) + { + mtx.Lock(); + cb.Add(val); + mtx.Unlock(); + return this; + } + + public operator-(val) + { + mtx.Lock(); + cb.Remove(val); + mtx.Unlock(); + return this; + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/exception.tcross b/Tesses.CrossLang.Std/src/Exceptions/Exception.tcross similarity index 68% rename from Tesses.CrossLang.Std/src/exception.tcross rename to Tesses.CrossLang.Std/src/Exceptions/Exception.tcross index a5e49cd..0dc86c2 100644 --- a/Tesses.CrossLang.Std/src/exception.tcross +++ b/Tesses.CrossLang.Std/src/Exceptions/Exception.tcross @@ -10,7 +10,7 @@ class Exception public ToString() { - var messagePart = $"{Class.Name(this)}: {Message}"; + var messagePart = $"{Class.Name(this)}: {this.Message}"; if(InnerException != undefined && InnerException != null) { var innerEx = InnerException.ToString().Replace("\n","\n\t"); @@ -18,12 +18,4 @@ class Exception } return messagePart; } -} - -class OutOfRangeException : Exception -{ - public OutOfRangeException(varName,$inner) - { - Exception($"{varName} is out of range.",inner); - } } \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Exceptions/OutOfRangeException.tcross b/Tesses.CrossLang.Std/src/Exceptions/OutOfRangeException.tcross new file mode 100644 index 0000000..f6b7ceb --- /dev/null +++ b/Tesses.CrossLang.Std/src/Exceptions/OutOfRangeException.tcross @@ -0,0 +1,7 @@ +class OutOfRangeException : Exception +{ + public OutOfRangeException(varName,$inner) + { + Exception($"{varName} is out of range.",inner); + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/ExecutorQueue.tcross b/Tesses.CrossLang.Std/src/ExecutorQueue.tcross new file mode 100644 index 0000000..691cadd --- /dev/null +++ b/Tesses.CrossLang.Std/src/ExecutorQueue.tcross @@ -0,0 +1,42 @@ +class ExecutorQueue { + private mtx = new Mutex(); + private items = []; + private thread; + private running=true; + + public ExecutorQueue() + { + thread = new Thread(()=>{ + while(running) + { + mtx.Lock(); + if(items.Count == 0) + { + mtx.Unlock(); + continue; + } + const item = items[0]; + items.RemoveAt(0); + mtx.Unlock(); + if(TypeIsCallable(item)) + item(); + } + }); + } + + + public EnqueueJob(cb) + { + mtx.Lock(); + items.Add(cb); + mtx.Unlock(); + } + + public Dispose() + { + mtx.Lock(); + running=false; + mtx.Unlock(); + thread.Join(); + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/FuncWithThis.tcross b/Tesses.CrossLang.Std/src/FuncWithThis.tcross new file mode 100644 index 0000000..a33cda3 --- /dev/null +++ b/Tesses.CrossLang.Std/src/FuncWithThis.tcross @@ -0,0 +1,12 @@ +func FuncWithThis( + function, + thisVal +) +{ + return ($$args)=>{ + const newArgs = [thisVal]; + each(var item : args) newArgs.Add(item); + + return function.Call(newArgs); + }; +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/MutexLock.tcross b/Tesses.CrossLang.Std/src/MutexLock.tcross new file mode 100644 index 0000000..2315eea --- /dev/null +++ b/Tesses.CrossLang.Std/src/MutexLock.tcross @@ -0,0 +1,19 @@ +class MutexLock +{ + private mtx; + public MutexLock(mtx) + { + this.mtx = mtx; + mtx.Lock(); + } + + public Dispose() + { + mtx.Unlock(); + } +} + +func Lock(mtx) +{ + return new MutexLock(mtx); +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/src/Result.tcross b/Tesses.CrossLang.Std/src/Result.tcross new file mode 100644 index 0000000..b9c0fbb --- /dev/null +++ b/Tesses.CrossLang.Std/src/Result.tcross @@ -0,0 +1,39 @@ +class Result { + private isError=false; + private value=null; + + public Result(value, isError) + { + this.value = value; + this.isError = isError; + } + + static Error(value) + { + return new Result(value,true); + } + + static OK(value) + { + return new Result(value,false); + } + + + + public getIsError() + { + return this.isError; + } + + public getValue() + { + return this.value; + } + + + public Unwrap() + { + if(isError) throw value; + return value; + } +} \ No newline at end of file diff --git a/Tesses.CrossLang.Std/tests/Collections.tcross b/Tesses.CrossLang.Std/tests/Collections.tcross new file mode 100644 index 0000000..253c0bf --- /dev/null +++ b/Tesses.CrossLang.Std/tests/Collections.tcross @@ -0,0 +1,48 @@ + + +Test("Collections",()=>{ + Spec("SequenceEquals",()=>{ + enumerable func myenum() + { + yield 42; + yield 69; + yield 128; + yield "Hello"; + } + Assert(SequenceEquals("MyString",['M','y','S','t','r','i','n','g']), "SequenceEquals is not functioning correctly, String MyString and array with same chars should return true"); + Assert(SequenceEquals(myenum(), [42,69,128,"Hello"]), "SequenceEquals is not functioning correctly, enumerable and list should return same result"); + }); + Spec("Queue", ()=>{ + const queue = new Queue(); + queue.Enqueue("Apple"); + queue.Enqueue(37); + Assert(!TypeIsDefined(queue.Enqueue("My String")), "Queue.Enqueue should not return value, but it does"); + Expect(queue.Dequeue()).ToBe("Apple"); + + Expect(queue.Peek()).LessThan(42); + + Expect(queue.Count).ToBe(2); + queue.Dequeue(); + Expect(queue.Count).ToBe(1); + + queue.Enqueue(4); + queue.Enqueue(5); + queue.Enqueue(true); + + Assert(SequenceEquals(queue,["My String",4,5,true]), "Queue isn't working correctly"); + + }); + + Spec("Stack", ()=>{ + const stack = new Stack(); + Assert(!TypeIsDefined(stack.Push(42)),"Stack.Push should not return a value, but it does"); + stack.Push(59); + Expect(stack.Count).ToBe(2); + Expect(stack.Pop()).ToBe(59); + Expect(stack.Top()).ToBe(42); + Expect(stack.Pop()).ToBe(42); + }); + + + +}); \ No newline at end of file diff --git a/build.tcross b/build.tcross index 1ed0529..32cbf25 100644 --- a/build.tcross +++ b/build.tcross @@ -14,7 +14,7 @@ func cmd(name, args) func main(args) { - var args2=["-o","./Tesses.CrossLang.BuildEssentials/bin-tmp","-r","./Tesses.CrossLang.BuildEssentials/res","-n","Tesses.CrossLang.BuildEssentials","-v","1.0.0.0-dev","Tesses.CrossLang.BuildEssentials/main.tcross"]; + var args2=["c","-o","./Tesses.CrossLang.BuildEssentials/bin-tmp","-r","./Tesses.CrossLang.BuildEssentials/res","-n","Tesses.CrossLang.BuildEssentials","-v","1.0.0.0-dev","Tesses.CrossLang.BuildEssentials/main.tcross"]; each(var f : FS.Local.EnumeratePaths("./Tesses.CrossLang.BuildEssentials/src")) { if(f.GetExtension() == ".tcross") @@ -25,21 +25,20 @@ func main(args) - cmd("crossc", args2); - cmd("crossvm",["./Tesses.CrossLang.BuildEssentials/bin-tmp/Tesses.CrossLang.BuildEssentials-1.0.0.0-dev.crvm","Tesses.CrossLang.Shell"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.PackageServer"]); - //cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.WebSite"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.Std"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/console"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/emptyweb"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/web"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/template"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/lib"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/compiletool"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/tool"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/webapp"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/npmweb"]); - cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/npmwebapp"]); + cmd("crosslang", args2); + cmd("crosslang",["vm","./Tesses.CrossLang.BuildEssentials/bin-tmp/Tesses.CrossLang.BuildEssentials-1.0.0.0-dev.crvm","Tesses.CrossLang.Shell"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.PackageServer"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.Std"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/console"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/emptyweb"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/web"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/template"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/lib"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/compiletool"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/tool"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/webapp"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/npmweb"]); + cmd("crosslang",["vm","./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Templates/npmwebapp"]); /* cmd("crossvm",["./Tesses.CrossLang.Shell/bin/Tesses.CrossLang.Shell-1.0.0.0-dev.crvm","build","Tesses.CrossLang.PackageServer"]);