aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/slice.ha21
-rw-r--r--main.ha20
-rw-r--r--todo/open.ha23
-rw-r--r--todo/print.ha5
4 files changed, 69 insertions, 0 deletions
diff --git a/lib/slice.ha b/lib/slice.ha
new file mode 100644
index 0000000..7cd2e30
--- /dev/null
+++ b/lib/slice.ha
@@ -0,0 +1,21 @@
+use fmt;
+
+export fn slice_remove_empty(slice: *[]str) void = {
+ for (let i = 0z; i < len(slice); i += 1) {
+ if (slice[i] == "") {
+ delete(slice[i]);
+ i -= 1;
+ };
+ };
+};
+
+@test fn slice_remove_empty() void = {
+ const slice: []str = alloc(["autumn", "", "winter"])!;
+ defer free(slice);
+
+ slice_remove_empty(&slice);
+
+ assert(len(slice) == 2);
+ assert(slice[0] == "autumn");
+ assert(slice[1] == "winter");
+};
diff --git a/main.ha b/main.ha
new file mode 100644
index 0000000..995d5d4
--- /dev/null
+++ b/main.ha
@@ -0,0 +1,20 @@
+use fmt;
+use strings;
+use todo;
+use fs;
+
+def TODO_FILE = "todo.txt";
+
+export fn main() void = {
+ const todos = match(todo::open(TODO_FILE)) {
+ case let todos: []str => yield todos;
+ case let err: fs::error => fmt::fatalf("Error opening {}: {}", TODO_FILE, fs::strerror(err));
+ };
+ defer strings::freeall(todos);
+
+ fmt::println("To-dos:")!;
+
+ for (let item .. todos) {
+ if (item != "") todo::print(item);
+ };
+};
diff --git a/todo/open.ha b/todo/open.ha
new file mode 100644
index 0000000..7692635
--- /dev/null
+++ b/todo/open.ha
@@ -0,0 +1,23 @@
+use fs;
+use io;
+use lib;
+use os;
+use strings;
+
+export fn open(file: str) ([]str | fs::error) = {
+
+ // open
+ const todos = os::open(file)?;
+ defer io::close(todos)!;
+
+ const todos = io::drain(todos)!;
+ defer free(todos);
+
+ // read
+ const todos = strings::fromutf8(todos)!;
+ const todos = strings::split(todos, "\n")!;
+
+ lib::slice_remove_empty(&todos);
+
+ return strings::dupall(todos)?;
+};
diff --git a/todo/print.ha b/todo/print.ha
new file mode 100644
index 0000000..4106fd9
--- /dev/null
+++ b/todo/print.ha
@@ -0,0 +1,5 @@
+use fmt;
+
+export fn print(todo: str) void = {
+ fmt::printfln("* {}", todo)!;
+};