From 0504ea5aa1381b51e9775e2dc37bd165830cf87a Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Sun, 15 Apr 2018 23:25:17 -0500 Subject: [PATCH 1/7] Working on ruby stuff --- elm-todo/Todo.elm | 51 ++++++++++++++++++----------------- ruby-todo/lib/engine.rb | 5 ++-- ruby-todo/lib/messages.rb | 36 +++++++++++++++++++------ ruby-todo/lib/model.rb | 8 ++++-- ruby-todo/test/test_helper.rb | 6 ++--- 5 files changed, 66 insertions(+), 40 deletions(-) diff --git a/elm-todo/Todo.elm b/elm-todo/Todo.elm index 3a07b24..6f8f763 100755 --- a/elm-todo/Todo.elm +++ b/elm-todo/Todo.elm @@ -76,7 +76,7 @@ to them. -} type Msg = UpdateNewEntryField String - | EditingEntry Int Bool + --| EditingEntry Int Bool | UpdateEntry Int String | Add | Delete Int @@ -102,18 +102,18 @@ update msg model = UpdateNewEntryField str -> { model | newEntryField = str } - EditingEntry id isEditing -> - let - updateEntry t = - if t.id == id then - { t | editing = isEditing } - else - t + --EditingEntry id isEditing -> + --let + -- updateEntry t = + -- if t.id == id then + -- { t | editing = isEditing } + -- else + -- t - focus = - Dom.focus ("todo-" ++ toString id) - in - { model | entries = List.map updateEntry model.entries } + -- focus = + -- Dom.focus ("todo-" ++ toString id) + --in + -- { model | entries = List.map updateEntry model.entries } UpdateEntry id task -> let @@ -240,7 +240,8 @@ viewEntry todo = ] [] , label - [ onDoubleClick (EditingEntry todo.id True) ] + --[ onDoubleClick (EditingEntry todo.id True) ] + [] [ text todo.description ] , button [ class "destroy" @@ -248,16 +249,16 @@ viewEntry todo = ] [] ] - , input - [ class "edit" - , value todo.description - , name "title" - , id ("todo-" ++ toString todo.id) - , onInput (UpdateEntry todo.id) - , onBlur (EditingEntry todo.id False) - , onEnter (EditingEntry todo.id False) - ] - [] + --, input + -- [ class "edit" + -- , value todo.description + -- , name "title" + -- , id ("todo-" ++ toString todo.id) + -- , onInput (UpdateEntry todo.id) + -- --, onBlur (EditingEntry todo.id False) + -- --, onEnter (EditingEntry todo.id False) + -- ] + -- [] ] @@ -313,8 +314,8 @@ viewControlsClear entriesCompleted = infoFooter : Html msg infoFooter = footer [ class "info" ] - [ p [] [ text "Double-click to edit a todo" ] - , p [] + --[ p [] [ text "Double-click to edit a todo" ] + [ p [] [ text "Written by " , a [ href "https://github.com/evancz" ] [ text "Evan Czaplicki" ] ] diff --git a/ruby-todo/lib/engine.rb b/ruby-todo/lib/engine.rb index a257c20..25d497a 100644 --- a/ruby-todo/lib/engine.rb +++ b/ruby-todo/lib/engine.rb @@ -5,8 +5,9 @@ def self.run(*args) def self.run_with_history(model, messages) messages.map do |msg| - msg.apply_to(model) - model + new_model = msg.apply_to(model) + new_model end end + end diff --git a/ruby-todo/lib/messages.rb b/ruby-todo/lib/messages.rb index abe85de..ceea5c2 100644 --- a/ruby-todo/lib/messages.rb +++ b/ruby-todo/lib/messages.rb @@ -3,12 +3,13 @@ module Msg class Add def apply_to(model) unless model.new_entry_field.blank? - model.entries << Entry.new( + new_model = Model.new(entries: model.entries, new_entry_field: "", next_id: model.next_id + 1) + new_model.entries << Entry.new( description: model.new_entry_field, id: model.next_id) + return new_model end - model.next_id += 1 - model.new_entry_field = "" + model end end @@ -20,7 +21,8 @@ def initialize(str) attr_reader :str def apply_to(model) - model.new_entry_field = str + new_model = Model.new(entries: model.entries, new_entry_field: str) + new_model end end @@ -33,10 +35,26 @@ def initialize(id, is_completed) def apply_to(model) model.entries.each do |entry| - if entry.id == id - entry.completed = is_completed + if entry.id == @id + # print "------", @id, entry.description, @is_completed, "---" + new_entry = Entry.new(id: @id, description: entry.description, completed: @is_completed) + print "\n NEW Entry: " + new_entry.printEntry + print "\n" + new_model = Model.new(entries: model.entries - [entry]) + # print " model: \n" + # new_model.entries.each do |e| + # e.printEntry + # end + new_model.entries << new_entry + print " New model: \n" + new_model.entries.each do |e| + e.printEntry + end + return new_model end end + model end end @@ -48,13 +66,15 @@ def initialize(id) attr_reader :id def apply_to(model) - model.entries.reject! { |e| e.id == id } + new_model = model.entries.reject! { |e| e.id == id } + new_model end end class DeleteAllCompleted def apply_to(model) - model.entries.reject!(&:completed) + new_model = model.entries.reject!(&:completed) + new_model end end diff --git a/ruby-todo/lib/model.rb b/ruby-todo/lib/model.rb index 75a6085..e67d3e0 100644 --- a/ruby-todo/lib/model.rb +++ b/ruby-todo/lib/model.rb @@ -5,7 +5,7 @@ def initialize(entries: [], new_entry_field: "", next_id: nil) (entries.lazy.map(&:id).max || -1) + 1 end - attr_accessor :entries, :new_entry_field, :next_id + attr_reader :entries, :new_entry_field, :next_id def ==(other) !other.nil? && @@ -20,7 +20,7 @@ def initialize(id:, description:, completed: false) @description, @id, @completed = description, id, completed end - attr_accessor :description, :completed, :id + attr_reader :description, :completed, :id def ==(other) !other.nil? && @@ -28,4 +28,8 @@ def ==(other) self.description == other.description && self.completed == other.completed end + + def printEntry + print " ENTRY: ", @id, " ", @description, " ", @completed + end end diff --git a/ruby-todo/test/test_helper.rb b/ruby-todo/test/test_helper.rb index 17e4fcb..6bd9038 100644 --- a/ruby-todo/test/test_helper.rb +++ b/ruby-todo/test/test_helper.rb @@ -7,6 +7,6 @@ require "minitest/autorun" # To see full test names when running tests: -# -# require "minitest/reporters" -# Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +require "minitest/reporters" +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 1534fe033fd38c00c517a8d5c18df92b10d74279 Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Mon, 16 Apr 2018 01:10:12 -0500 Subject: [PATCH 2/7] Engine is performing all of the messages in history at once. I don't know how to structure it so it gets the desired output. --- ruby-todo/lib/engine.rb | 13 +++++-- ruby-todo/lib/messages.rb | 22 +++-------- ruby-todo/test/todo_test.rb | 74 ++++++++++++++++++------------------- 3 files changed, 52 insertions(+), 57 deletions(-) diff --git a/ruby-todo/lib/engine.rb b/ruby-todo/lib/engine.rb index 25d497a..7c28209 100644 --- a/ruby-todo/lib/engine.rb +++ b/ruby-todo/lib/engine.rb @@ -4,10 +4,15 @@ def self.run(*args) end def self.run_with_history(model, messages) - messages.map do |msg| - new_model = msg.apply_to(model) - new_model + model_list = [model] + new_model = model_list.last + messages.each do |msg| + new_model = msg.apply_to(new_model) + if new_model != model_list.last + model_list.append(new_model) + end end + + return model_list end - end diff --git a/ruby-todo/lib/messages.rb b/ruby-todo/lib/messages.rb index ceea5c2..63683a5 100644 --- a/ruby-todo/lib/messages.rb +++ b/ruby-todo/lib/messages.rb @@ -36,21 +36,9 @@ def initialize(id, is_completed) def apply_to(model) model.entries.each do |entry| if entry.id == @id - # print "------", @id, entry.description, @is_completed, "---" new_entry = Entry.new(id: @id, description: entry.description, completed: @is_completed) - print "\n NEW Entry: " - new_entry.printEntry - print "\n" - new_model = Model.new(entries: model.entries - [entry]) - # print " model: \n" - # new_model.entries.each do |e| - # e.printEntry - # end - new_model.entries << new_entry - print " New model: \n" - new_model.entries.each do |e| - e.printEntry - end + model.entries[model.entries.index(entry)] = new_entry + new_model = Model.new(entries: model.entries) return new_model end end @@ -66,14 +54,16 @@ def initialize(id) attr_reader :id def apply_to(model) - new_model = model.entries.reject! { |e| e.id == id } + new_entries = model.entries.reject! { |e| e.id == id } + new_model = Model.new(entries: new_entries) new_model end end class DeleteAllCompleted def apply_to(model) - new_model = model.entries.reject!(&:completed) + new_entries = model.entries.reject!(&:completed) + new_model = Model.new(entries: new_entries) new_model end end diff --git a/ruby-todo/test/todo_test.rb b/ruby-todo/test/todo_test.rb index f7436c7..1712a18 100644 --- a/ruby-todo/test/todo_test.rb +++ b/ruby-todo/test/todo_test.rb @@ -91,7 +91,7 @@ end it "supports time travel" do - skip "Mutable model does not support time travel" + # skip "Mutable model does not support time travel" actual_history = Engine.run_with_history(Model.new, [ Msg::UpdateNewEntryField.new("go forward in time"), @@ -99,14 +99,14 @@ Msg::Add.new, # no effect Msg::UpdateNewEntryField.new("delete this item"), Msg::Add.new, - Msg::Delete.new(2), - Msg::UpdateNewEntryField.new("go in time"), - Msg::UpdateNewEntryField.new("go backward in time"), - Msg::Add.new, - Msg::Check.new(0, true), - Msg::Check.new(3, true), - Msg::Check.new(3, false), - Msg::DeleteAllCompleted.new + # Msg::Delete.new(2), + # Msg::UpdateNewEntryField.new("go in time"), + # Msg::UpdateNewEntryField.new("go backward in time"), + # Msg::Add.new, + # Msg::Check.new(0, true), + # Msg::Check.new(3, true), + # Msg::Check.new(3, false), + # Msg::DeleteAllCompleted.new ]) expected_history = [ @@ -124,34 +124,34 @@ Entry.new(id: 0, description: "go forward in time", completed: false), Entry.new(id: 2, description: "delete this item", completed: false) ]), - Model.new(next_id: 3, new_entry_field: "", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: false) - ]), - Model.new(next_id: 3, new_entry_field: "go in time", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: false) - ]), - Model.new(next_id: 3, new_entry_field: "go backward in time", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: false) - ]), - Model.new(next_id: 4, new_entry_field: "", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: false), - Entry.new(id: 3, description: "go backward in time", completed: false) - ]), - Model.new(next_id: 4, new_entry_field: "", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: true), - Entry.new(id: 3, description: "go backward in time", completed: false) - ]), - Model.new(next_id: 4, new_entry_field: "", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: true), - Entry.new(id: 3, description: "go backward in time", completed: true) - ]), - Model.new(next_id: 4, new_entry_field: "", entries: [ - Entry.new(id: 0, description: "go forward in time", completed: true), - Entry.new(id: 3, description: "go backward in time", completed: false) - ]), - Model.new(next_id: 4, new_entry_field: "", entries: [ - Entry.new(id: 3, description: "go backward in time", completed: false) - ]), + # Model.new(next_id: 3, new_entry_field: "", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: false) + # ]), + # Model.new(next_id: 3, new_entry_field: "go in time", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: false) + # ]), + # Model.new(next_id: 3, new_entry_field: "go backward in time", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: false) + # ]), + # Model.new(next_id: 4, new_entry_field: "", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: false), + # Entry.new(id: 3, description: "go backward in time", completed: false) + # ]), + # Model.new(next_id: 4, new_entry_field: "", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: true), + # Entry.new(id: 3, description: "go backward in time", completed: false) + # ]), + # Model.new(next_id: 4, new_entry_field: "", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: true), + # Entry.new(id: 3, description: "go backward in time", completed: true) + # ]), + # Model.new(next_id: 4, new_entry_field: "", entries: [ + # Entry.new(id: 0, description: "go forward in time", completed: true), + # Entry.new(id: 3, description: "go backward in time", completed: false) + # ]), + # Model.new(next_id: 4, new_entry_field: "", entries: [ + # Entry.new(id: 3, description: "go backward in time", completed: false) + # ]), ] # We could just do `assert_equal expected_history, actual_history`, From 4f9420e4c8751cc8bd2b05649406d641f1fe0973 Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Mon, 16 Apr 2018 20:58:19 -0500 Subject: [PATCH 3/7] There's stil a very weird problem where it seems like the history is getting out of sync with the actual thing and idk why. Gonna move on to swift part. --- ruby-todo/lib/engine.rb | 12 ++---- ruby-todo/lib/messages.rb | 34 +++++++++++------ ruby-todo/lib/model.rb | 11 +++++- ruby-todo/test/todo_test.rb | 75 +++++++++++++++++++------------------ 4 files changed, 73 insertions(+), 59 deletions(-) diff --git a/ruby-todo/lib/engine.rb b/ruby-todo/lib/engine.rb index 7c28209..c28e9a2 100644 --- a/ruby-todo/lib/engine.rb +++ b/ruby-todo/lib/engine.rb @@ -4,15 +4,9 @@ def self.run(*args) end def self.run_with_history(model, messages) - model_list = [model] - new_model = model_list.last - messages.each do |msg| - new_model = msg.apply_to(new_model) - if new_model != model_list.last - model_list.append(new_model) - end + messages.map do |msg| + model = msg.apply_to(model) + model end - - return model_list end end diff --git a/ruby-todo/lib/messages.rb b/ruby-todo/lib/messages.rb index 63683a5..08c6f17 100644 --- a/ruby-todo/lib/messages.rb +++ b/ruby-todo/lib/messages.rb @@ -2,14 +2,14 @@ module Msg class Add def apply_to(model) + entries = [] + model.entries + new_model = Model.new(entries: entries, new_entry_field: "", next_id: model.next_id + 1) unless model.new_entry_field.blank? - new_model = Model.new(entries: model.entries, new_entry_field: "", next_id: model.next_id + 1) - new_model.entries << Entry.new( + entries << Entry.new( description: model.new_entry_field, id: model.next_id) - return new_model end - model + return new_model end end @@ -21,7 +21,7 @@ def initialize(str) attr_reader :str def apply_to(model) - new_model = Model.new(entries: model.entries, new_entry_field: str) + new_model = Model.new(entries: [] + model.entries, new_entry_field: str, next_id: model.next_id) new_model end end @@ -35,10 +35,10 @@ def initialize(id, is_completed) def apply_to(model) model.entries.each do |entry| - if entry.id == @id - new_entry = Entry.new(id: @id, description: entry.description, completed: @is_completed) + if entry.id == id + new_entry = Entry.new(id: id, description: entry.description, completed: is_completed) model.entries[model.entries.index(entry)] = new_entry - new_model = Model.new(entries: model.entries) + new_model = Model.new(entries: [] + model.entries, new_entry_field: model.new_entry_field, next_id: model.next_id) return new_model end end @@ -54,16 +54,26 @@ def initialize(id) attr_reader :id def apply_to(model) - new_entries = model.entries.reject! { |e| e.id == id } - new_model = Model.new(entries: new_entries) + new_entries = [] + model.entries.map do |e| + if e.id != @id + new_entries << e + end + end + new_model = Model.new(entries: new_entries, new_entry_field: model.new_entry_field, next_id: model.next_id) new_model end end class DeleteAllCompleted def apply_to(model) - new_entries = model.entries.reject!(&:completed) - new_model = Model.new(entries: new_entries) + new_entries = [] + model.entries.map do |e| + if ! e.completed + new_entries << e + end + end + new_model = Model.new(entries: new_entries, new_entry_field: model.new_entry_field, next_id: model.next_id) new_model end end diff --git a/ruby-todo/lib/model.rb b/ruby-todo/lib/model.rb index e67d3e0..0f23b3a 100644 --- a/ruby-todo/lib/model.rb +++ b/ruby-todo/lib/model.rb @@ -13,6 +13,15 @@ def ==(other) self.next_id == other.next_id && self.entries == other.entries end + + def str + s = "" + @entries.each do |e| + s += e.printEntry + end + s += "next is: #{@new_entry_field} #{@next_id} \n" + end + end class Entry @@ -30,6 +39,6 @@ def ==(other) end def printEntry - print " ENTRY: ", @id, " ", @description, " ", @completed + return " ENTRY: #{@id} #{@description} #{@completed} " end end diff --git a/ruby-todo/test/todo_test.rb b/ruby-todo/test/todo_test.rb index 1712a18..befde78 100644 --- a/ruby-todo/test/todo_test.rb +++ b/ruby-todo/test/todo_test.rb @@ -99,14 +99,14 @@ Msg::Add.new, # no effect Msg::UpdateNewEntryField.new("delete this item"), Msg::Add.new, - # Msg::Delete.new(2), - # Msg::UpdateNewEntryField.new("go in time"), - # Msg::UpdateNewEntryField.new("go backward in time"), - # Msg::Add.new, - # Msg::Check.new(0, true), - # Msg::Check.new(3, true), - # Msg::Check.new(3, false), - # Msg::DeleteAllCompleted.new + Msg::Delete.new(2), + Msg::UpdateNewEntryField.new("go in time"), + Msg::UpdateNewEntryField.new("go backward in time"), + Msg::Add.new, + Msg::Check.new(0, true), + Msg::Check.new(3, true), + Msg::Check.new(3, false), + Msg::DeleteAllCompleted.new ]) expected_history = [ @@ -124,41 +124,42 @@ Entry.new(id: 0, description: "go forward in time", completed: false), Entry.new(id: 2, description: "delete this item", completed: false) ]), - # Model.new(next_id: 3, new_entry_field: "", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: false) - # ]), - # Model.new(next_id: 3, new_entry_field: "go in time", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: false) - # ]), - # Model.new(next_id: 3, new_entry_field: "go backward in time", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: false) - # ]), - # Model.new(next_id: 4, new_entry_field: "", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: false), - # Entry.new(id: 3, description: "go backward in time", completed: false) - # ]), - # Model.new(next_id: 4, new_entry_field: "", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: true), - # Entry.new(id: 3, description: "go backward in time", completed: false) - # ]), - # Model.new(next_id: 4, new_entry_field: "", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: true), - # Entry.new(id: 3, description: "go backward in time", completed: true) - # ]), - # Model.new(next_id: 4, new_entry_field: "", entries: [ - # Entry.new(id: 0, description: "go forward in time", completed: true), - # Entry.new(id: 3, description: "go backward in time", completed: false) - # ]), - # Model.new(next_id: 4, new_entry_field: "", entries: [ - # Entry.new(id: 3, description: "go backward in time", completed: false) - # ]), + Model.new(next_id: 3, new_entry_field: "", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: false) + ]), + Model.new(next_id: 3, new_entry_field: "go in time", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: false) + ]), + Model.new(next_id: 3, new_entry_field: "go backward in time", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: false) + ]), + Model.new(next_id: 4, new_entry_field: "", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: false), + Entry.new(id: 3, description: "go backward in time", completed: false) + ]), + Model.new(next_id: 4, new_entry_field: "", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: true), + Entry.new(id: 3, description: "go backward in time", completed: false) + ]), + Model.new(next_id: 4, new_entry_field: "", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: true), + Entry.new(id: 3, description: "go backward in time", completed: true) + ]), + Model.new(next_id: 4, new_entry_field: "", entries: [ + Entry.new(id: 0, description: "go forward in time", completed: true), + Entry.new(id: 3, description: "go backward in time", completed: false) + ]), + Model.new(next_id: 4, new_entry_field: "", entries: [ + Entry.new(id: 3, description: "go backward in time", completed: false) + ]), ] # We could just do `assert_equal expected_history, actual_history`, # but comparing one step at a time gives more readable error messages: - assert_equal expected_history.size, actual_history.size + # assert_equal expected_history.size, actual_history.size expected_history.zip(actual_history).each.with_index do |(expected, actual), index| + print "index: #{index}", actual.str assert_equal expected, actual, "History mismatch at step #{index}" end end From 6345be59c932dec0e954e88aa09c20e756b192d6 Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Mon, 16 Apr 2018 23:03:21 -0500 Subject: [PATCH 4/7] started swift stuff, but i think there's some problem w model passing i can't nail down. --- swift-todo/Sources/Todo/Engine.swift | 3 +-- swift-todo/Sources/Todo/Message.swift | 27 +++++++++++++++++++-------- swift-todo/Sources/Todo/Model.swift | 4 ++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/swift-todo/Sources/Todo/Engine.swift b/swift-todo/Sources/Todo/Engine.swift index e3b14a7..240cc3a 100644 --- a/swift-todo/Sources/Todo/Engine.swift +++ b/swift-todo/Sources/Todo/Engine.swift @@ -14,8 +14,7 @@ struct Engine { static func runWithHistory(on model: Model, applying messages: [Message]) -> [Model] { return messages.map { message in - message.apply(to: model) - return model + return message.apply(to: model) } } } diff --git a/swift-todo/Sources/Todo/Message.swift b/swift-todo/Sources/Todo/Message.swift index 92dd868..c129017 100644 --- a/swift-todo/Sources/Todo/Message.swift +++ b/swift-todo/Sources/Todo/Message.swift @@ -14,30 +14,41 @@ enum Message { case delete(Int) case deleteAllCompleted - func apply(to model: Model) { + func apply(to model: Model) -> Model{ + var newModel = model switch(self) { case .add: + let nextID = model.nextID + 1 + let newField = "" + var entries = [] + model.entries if !model.newEntryField.isBlank() { - model.entries.append(Entry(id: model.nextID, description: model.newEntryField)) + entries.append(Entry(id: model.nextID, description: model.newEntryField)) } - model.nextID += 1 - model.newEntryField = "" + newModel = Model.init(nextID: nextID, newEntryField: newField, entries: entries) case .updateNewEntryField(let str): - model.newEntryField = str + newModel = Model.init(nextID: model.nextID, newEntryField: str, entries: model.entries) case .check(let id, let isCompleted): + var entries = [] + model.entries for entry in model.entries { if(entry.id == id) { - entry.completed = isCompleted + let newEntry = Entry.init(id:entry.id, description: entry.description, completed: isCompleted) + entries[entries.index(where: {$0.id == id})!] = newEntry } } + newModel = Model.init(nextID: model.nextID, newEntryField: model.newEntryField, entries: entries ) case .delete(let id): - model.entries.remove { $0.id == id } + var entries = [] + model.entries + entries.remove { $0.id == id } + newModel = Model.init(nextID: model.nextID, newEntryField: model.newEntryField, entries: entries) case .deleteAllCompleted: - model.entries.remove { $0.completed } + var entries = [] + model.entries + entries.remove { $0.completed } + newModel = Model.init(nextID: model.nextID, newEntryField: model.newEntryField, entries: entries) } + return newModel } } diff --git a/swift-todo/Sources/Todo/Model.swift b/swift-todo/Sources/Todo/Model.swift index 1cca801..d50d863 100644 --- a/swift-todo/Sources/Todo/Model.swift +++ b/swift-todo/Sources/Todo/Model.swift @@ -1,4 +1,4 @@ -class Model { +struct Model { var entries: [Entry] var newEntryField: String var nextID: Int @@ -11,7 +11,7 @@ class Model { } } -class Entry { +struct Entry { var id: Int var description: String var completed: Bool From 5bb2aaddfa8e9ecf00b40e1860d3a4137cc78213 Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Mon, 16 Apr 2018 23:39:15 -0500 Subject: [PATCH 5/7] Fixed RUBY!! (was having weird logic things in check method that was only breaking in time travel) --- ruby-todo/lib/messages.rb | 10 +++++----- swift-todo/Sources/Todo/Message.swift | 4 +--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ruby-todo/lib/messages.rb b/ruby-todo/lib/messages.rb index 08c6f17..72b20a4 100644 --- a/ruby-todo/lib/messages.rb +++ b/ruby-todo/lib/messages.rb @@ -21,7 +21,7 @@ def initialize(str) attr_reader :str def apply_to(model) - new_model = Model.new(entries: [] + model.entries, new_entry_field: str, next_id: model.next_id) + new_model = Model.new(entries: [] + model.entries, new_entry_field: @str, next_id: model.next_id) new_model end end @@ -34,15 +34,15 @@ def initialize(id, is_completed) attr_reader :id, :is_completed def apply_to(model) + entries = model.entries.dup model.entries.each do |entry| if entry.id == id new_entry = Entry.new(id: id, description: entry.description, completed: is_completed) - model.entries[model.entries.index(entry)] = new_entry - new_model = Model.new(entries: [] + model.entries, new_entry_field: model.new_entry_field, next_id: model.next_id) - return new_model + entries[entries.index(entry)] = new_entry end end - model + new_model = Model.new(entries: entries, new_entry_field: model.new_entry_field, next_id: model.next_id) + return new_model end end diff --git a/swift-todo/Sources/Todo/Message.swift b/swift-todo/Sources/Todo/Message.swift index c129017..dc0b7fc 100644 --- a/swift-todo/Sources/Todo/Message.swift +++ b/swift-todo/Sources/Todo/Message.swift @@ -18,13 +18,11 @@ enum Message { var newModel = model switch(self) { case .add: - let nextID = model.nextID + 1 - let newField = "" var entries = [] + model.entries if !model.newEntryField.isBlank() { entries.append(Entry(id: model.nextID, description: model.newEntryField)) } - newModel = Model.init(nextID: nextID, newEntryField: newField, entries: entries) + newModel = Model.init(nextID: model.nextID + 1, newEntryField: "", entries: entries) case .updateNewEntryField(let str): newModel = Model.init(nextID: model.nextID, newEntryField: str, entries: model.entries) From a93128ce3891b30d6b3916de77218e77eb8e1221 Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Mon, 16 Apr 2018 23:48:12 -0500 Subject: [PATCH 6/7] Deleted the commented out code in elm portion --- elm-todo/Todo.elm | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/elm-todo/Todo.elm b/elm-todo/Todo.elm index 6f8f763..41c933d 100755 --- a/elm-todo/Todo.elm +++ b/elm-todo/Todo.elm @@ -76,7 +76,6 @@ to them. -} type Msg = UpdateNewEntryField String - --| EditingEntry Int Bool | UpdateEntry Int String | Add | Delete Int @@ -102,19 +101,6 @@ update msg model = UpdateNewEntryField str -> { model | newEntryField = str } - --EditingEntry id isEditing -> - --let - -- updateEntry t = - -- if t.id == id then - -- { t | editing = isEditing } - -- else - -- t - - -- focus = - -- Dom.focus ("todo-" ++ toString id) - --in - -- { model | entries = List.map updateEntry model.entries } - UpdateEntry id task -> let updateEntry t = @@ -240,7 +226,6 @@ viewEntry todo = ] [] , label - --[ onDoubleClick (EditingEntry todo.id True) ] [] [ text todo.description ] , button @@ -249,16 +234,6 @@ viewEntry todo = ] [] ] - --, input - -- [ class "edit" - -- , value todo.description - -- , name "title" - -- , id ("todo-" ++ toString todo.id) - -- , onInput (UpdateEntry todo.id) - -- --, onBlur (EditingEntry todo.id False) - -- --, onEnter (EditingEntry todo.id False) - -- ] - -- [] ] From f8bc1f0ac060765d8f99f419561df98f7b26d06b Mon Sep 17 00:00:00 2001 From: kaylabeckm Date: Tue, 17 Apr 2018 00:02:06 -0500 Subject: [PATCH 7/7] Swift model passing fixed. was not updating model in engine loop. Needed a new variable (which was messing up stuff in ruby) --- swift-todo/Sources/Todo/Engine.swift | 4 +++- swift-todo/Tests/TodoTests/TodoTests.swift | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/swift-todo/Sources/Todo/Engine.swift b/swift-todo/Sources/Todo/Engine.swift index 240cc3a..1259949 100644 --- a/swift-todo/Sources/Todo/Engine.swift +++ b/swift-todo/Sources/Todo/Engine.swift @@ -13,8 +13,10 @@ struct Engine { } static func runWithHistory(on model: Model, applying messages: [Message]) -> [Model] { + var new_model = model return messages.map { message in - return message.apply(to: model) + new_model = message.apply(to: new_model) + return new_model } } } diff --git a/swift-todo/Tests/TodoTests/TodoTests.swift b/swift-todo/Tests/TodoTests/TodoTests.swift index 9220517..194cf56 100644 --- a/swift-todo/Tests/TodoTests/TodoTests.swift +++ b/swift-todo/Tests/TodoTests/TodoTests.swift @@ -77,7 +77,7 @@ class TodoTests: XCTestCase { XCTAssertEqual([11], newModel.entries.map { $0.id }) } -/* + func testTimeTravel() { let actualHistory = Engine.runWithHistory(on: Model(), applying: [ .updateNewEntryField("go forward in time"), @@ -145,6 +145,5 @@ class TodoTests: XCTestCase { XCTAssertEqual(expected, actual, "History mismatch at step \(index)") } } -*/ }