Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions hw6/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ func main() {
office := *post.NewSortOffice()

// Configure senders.
boxSender := func(p post.PackageI) {
boxSender := func(p post.Package) {
fmt.Println("BoxSender is sending " + p.PackageType() + " from " + p.SenderAddress() + " to " + p.RecepientAddress())
}
office.AddSender(post.BoxPackageType, boxSender)

envelopeSender := func(p post.PackageI) {
envelopeSender := func(p post.Package) {
fmt.Println("EnvelopeSender is sending " + p.PackageType() + " from " + p.SenderAddress() + " to " + p.RecepientAddress())
}
office.AddSender(post.EnvelopePackageType, envelopeSender)
Expand Down
6 changes: 3 additions & 3 deletions hw6/post/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const BoxPackageType = "box"
const EnvelopePackageType = "envelope"

// Package interface.
type PackageI interface {
type Package interface {
PackageType() string
SenderAddress() string
RecepientAddress() string
}

// box implementation of PackageI
// box implementation of Package
type box struct {
}

Expand All @@ -28,7 +28,7 @@ func (b *box) RecepientAddress() string {
return "recepient address"
}

// Envelope implementation of PackageI
// Envelope implementation of Package
type Envelope struct {
}

Expand Down
8 changes: 4 additions & 4 deletions hw6/post/sortOffice.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ import "errors"

// Sorting office.
type sortOffice struct {
senders map[string]func(PackageI)
senders map[string]func(Package)
}

// Sorting office constructor.
func NewSortOffice() *sortOffice {
return &sortOffice{
senders: make(map[string]func(PackageI)),
senders: make(map[string]func(Package)),
}
}

// Add sender function for each package type.
func (s *sortOffice) AddSender(packageType string, fn func(p PackageI)) {
func (s *sortOffice) AddSender(packageType string, fn func(p Package)) {
s.senders[packageType] = fn
}

// Send package via configured sender function.
func (s *sortOffice) Send(p PackageI) error {
func (s *sortOffice) Send(p Package) error {
sendFn, ok := s.senders[p.PackageType()]

if !ok {
Expand Down
12 changes: 9 additions & 3 deletions hw6/transport.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@ import (
func main() {
route := transport.NewRoute()

car := transport.NewCar()
train := transport.NewTrain()
plane := transport.NewPlane()
car := transport.NewCar(4)
_ = car.TakePassengers(transport.NewPassenger())
_ = car.TakePassengers(transport.NewPassenger())

train := transport.NewTrain(200)

planeRegistration := transport.NewRegistration()
planeRegistration.AddPassengers(transport.NewPassenger())
plane := transport.NewPlane(planeRegistration)

route.AddTransport(car)
route.AddTransport(train)
Expand Down
25 changes: 19 additions & 6 deletions hw6/transport/car.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package transport

type Car struct{}
import (
"errors"
"strconv"
)

type Car struct {
maxPassengers int
passengers []*passenger
}

func NewCar() *Car {
return &Car{}
func NewCar(maxPassengers int) *Car {
return &Car{maxPassengers: maxPassengers}
}

func (c *Car) Name() string {
Expand All @@ -18,12 +26,17 @@ func (c *Car) Stop() {
println("Car stopped")
}

func (c *Car) ChangeSpeed() {
func (c *Car) ChangeSpeed(int) error {
println("Car changed speed")
return nil
}

func (c *Car) TakePassengers() {
println("Car took passengers")
func (c *Car) TakePassengers(p *passenger) error {
if len(c.passengers) == c.maxPassengers {
return errors.New("Cannot take more than " + strconv.Itoa(c.maxPassengers))
}
c.passengers = append(c.passengers, p)
return nil
}

func (c *Car) DropPassengers() {
Expand Down
7 changes: 7 additions & 0 deletions hw6/transport/passenger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package transport

type passenger struct{}

func NewPassenger() *passenger {
return &passenger{}
}
35 changes: 28 additions & 7 deletions hw6/transport/plane.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
package transport

type plane struct{}
import "errors"

type plane struct {
registration *registration
passengers []*passenger
}

func NewPlane(registration *registration) *plane {
return &plane{registration: registration}
}

func (p *plane) Name() string {
return "Plane"
Expand All @@ -14,17 +23,29 @@ func (p *plane) Stop() {
println("Plane stopped")
}

func (p *plane) ChangeSpeed() {
func (p *plane) ChangeSpeed(int) error {
println("Plane changed speed")
return nil
}

func (p *plane) TakePassengers() {
println("Plane took passengers")
func (pl *plane) TakePassengers(p *passenger) error {
// Check if passenger is in registration list.
found := false
for _, pr := range pl.registration.passengers {
if p == pr {
found = true
}
}

if !found {
return errors.New("passenger not found in registration")
}

pl.passengers = append(pl.passengers, p)

return nil
}

func (p *plane) DropPassengers() {
println("Plane dropped passengers")
}
func NewPlane() *plane {
return &plane{}
}
13 changes: 13 additions & 0 deletions hw6/transport/registration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package transport

type registration struct {
passengers []*passenger
}

func NewRegistration() *registration {
return &registration{}
}

func (r *registration) AddPassengers(p *passenger) {
r.passengers = append(r.passengers, p)
}
4 changes: 2 additions & 2 deletions hw6/transport/route.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package transport

type route struct {
transport []TransportI
transport []Transport
}

func NewRoute() *route {
return &route{}
}

func (r *route) AddTransport(t TransportI) {
func (r *route) AddTransport(t Transport) {
r.transport = append(r.transport, t)
}

Expand Down
28 changes: 22 additions & 6 deletions hw6/transport/train.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package transport

type train struct{}
import (
"errors"
"strconv"
)

type train struct {
maxSpeed int
speed int
}

func NewTrain() *train {
return &train{}
func NewTrain(maxSpeed int) *train {
return &train{maxSpeed: maxSpeed}
}

func (t *train) Name() string {
Expand All @@ -18,12 +26,20 @@ func (t *train) Stop() {
println("Train stopped")
}

func (t *train) ChangeSpeed() {
println("Train changed speed")
func (t *train) ChangeSpeed(speedChange int) error {
newSpeed := t.speed + speedChange

if newSpeed > t.maxSpeed {
return errors.New("speed is over max: " + strconv.Itoa(t.maxSpeed))
}

t.speed = newSpeed
return nil
}

func (t *train) TakePassengers() {
func (t *train) TakePassengers(*passenger) error {
println("Train took passengers")
return nil
}

func (t *train) DropPassengers() {
Expand Down
11 changes: 11 additions & 0 deletions hw6/transport/transport.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package transport

// Transport interface.
type Transport interface {
Name() string
Move()
Stop()
ChangeSpeed(speedChange int) error
TakePassengers(p *passenger) error
DropPassengers()
}
11 changes: 0 additions & 11 deletions hw6/transport/transportI.go

This file was deleted.