diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..49c89a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Various IDEs and Editors +.vscode/ +.idea/ +**/*~ + +# Mac OSX temporary files +.DS_Store +**/.DS_Store + +# dfx temporary files +.dfx/ + +# generated files +**/declarations/ + +# rust +target/ + +# frontend code +node_modules/ +dist/ +.svelte-kit/ + +# environment variables +.env diff --git a/dfx.json b/dfx.json new file mode 100644 index 0000000..f15fa65 --- /dev/null +++ b/dfx.json @@ -0,0 +1,16 @@ +{ + "canisters": { + "motoko_backend": { + "main": "src/motoko_backend/main.mo", + "type": "motoko" + } + }, + "defaults": { + "build": { + "args": "", + "packtool": "" + } + }, + "output_env_file": ".env", + "version": 1 +} \ No newline at end of file diff --git a/src/motoko_backend/main.mo b/src/motoko_backend/main.mo new file mode 100644 index 0000000..a55c365 --- /dev/null +++ b/src/motoko_backend/main.mo @@ -0,0 +1,73 @@ +import Text "mo:base/Text"; +import Bool "mo:base/Bool"; +import Hash "mo:base/Hash"; +import Nat "mo:base/Nat"; +import Map "mo:base/HashMap"; +import Iter "mo:base/Iter"; +actor Assistant + { + public query func greet(name : Text) : async Text + { + return "Hello, " # name # "!"; + }; + + type ToDo = + { + description: Text; + completed: Bool; + }; + + + func naturalHash(n: Nat) : Hash.Hash + { + Text.hash(Nat.toText(n)) + }; + + var todos = Map.HashMap(0, Nat.equal, naturalHash); + var nextID: Nat = 0; + + public query func getTodos() : async [ToDo] + { + Iter.toArray(todos.vals()); + }; + + public query func addTodo(description: Text) : async Nat + { + let id = nextID; + todos.put(id, {description = description; completed = false}); + nextID += 1; + id + }; + + public func completeToDo(id: Nat): async () + { + ignore do ? + { + let description = todos.get(id)!.description; + todos.put(id, {description; completed = true}); + }; + }; + + public query func showTodos() : async Text + { + var output : Text = "\nTO-DO\n"; + for (todo: ToDo in todos.vals()) + { + output #= "\n" # todo.description; + if (todo.completed) + { + output #= "+"; + }; + }; + output # "\n" + }; + + public func clearCompleted() : async () + { + todos := Map.mapFilter(todos, Nat.equal, naturalHash, + func(_, todo) + { + if (todo.completed) null else ?todo + }); + }; + };