Skip to content

Instantly share code, notes, and snippets.

@Lucifier129
Created November 16, 2021 07:38

Revisions

  1. Lucifier129 created this gist Nov 16, 2021.
    74 changes: 74 additions & 0 deletions todo-app.remesh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@

    domain TodoInputDomain {
    state TodoInput = ''

    command updateTodoInput(newTodoInput: string) {
    return TodoInput.new(newTodoInput)
    }
    }

    type Todo = {
    id: string
    content: string
    completed: boolean
    }

    domain TodoListDomain {
    state TodoList = [] as Todo[]

    event AddTodoFailedEvent: {
    message: string
    }

    event AddTodoSuccessEvent: {
    todo: Todo
    }

    command addTodo(content: string) {
    if (content.length < 1) {
    return AddTodoFailedEvent({
    message: 'Todo content must be at least 1 character long'
    })
    }

    let todoList = TodoList.get()

    let todo = {
    id: uuid(),
    content,
    completed: false
    }


    return [
    AddTodoSuccessEvent({ todo }),
    TodoList.new(todoList.concat(todo))
    ]
    }
    }


    domain TodoHeader {
    domain todoInputDomain = TodoInputDomain.get()

    domain todoListDomain = TodoListDomain.get()

    query todoHeader() {
    return {
    todoInput: todoInputDomain.TodoInput.get(),
    todoList: todoListDomain.TodoList.get()
    }
    }

    command updateTodoInput = todoInputDomain.command.updateTodoInput

    command addTodo() {
    let content = todoInputDomain.TodoInput.get()
    return todoListDomain.command.addTodo(content)
    }

    command$ todoHeader() {
    return fromEvent(todoListDomain.event.AddTodoSuccessEvent)
    |> map(() => todoInputDomain.command.updateTodoInput(''))
    }
    }