lec03 generic servers

This commit is contained in:
SowinskiBraeden committed 2026-09-22 12:21:27 -07:00
1 parent a579cf11a1
commit 4abfd6b848
23 files changed
+502

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
### Structs
defmodule Name do
# defaults to john doe
# or without defaults
# defstruct [:first, :last]
defstruct [first: "john", last: "doe"]
def new(firstname, lastname) do
%Name{first: firstname, last: lastname}
end
end
defmodule Student do
# default empty id, default name, default empty score map
defstruct [id: "", name: %Name{}, scores: %{}]
# default scores to empty map
def new(id, firstname, lastname, scores \\ %{}) do
%Student{id: id, name: Name.new(firstname, lastname), scores: scores}
end
# returns a new map
def add_score(%Student{} = s, course, score) do
%Student{s | scores: Map.put(s.scores, course, score)}
end
def parse(line) do
case String.split(line) do
[id, firstname, lastname | rest] ->
# chunk_every returns a list of lists
scores = for [c, s] <- Enum.chunk_every(rest, 2), into: %{},
do: {c, String.to_integer(s)}
Student.new(id, firstname, lastname, scores)
_ -> :error
end
end
def read_data(file) do
{:ok, content} = File.read(file)
content |> String.split("\n") |> Enum.map(&parse/1) |> Enum.filter(& &1 != :error)
end
end
# s = Student.new("a22222222", "homer", "simpson")
# # struct pattern matching
# %Student{id: x} = s
# x # -> a22222222
# %Student{} = s # doesnt match anything
# # but ensures that s is a Student
# Student.add_score(s, "comp4958", 55)