main
 1package domain
 2
 3type MovieLibrary struct {
 4	Movies []Movie
 5}
 6
 7//type Specification interface {
 8//IsSatisfiedBy(m Movie) bool
 9//}
10
11func (self *MovieLibrary) Find(fn Predicate) *Movie {
12	for i := range self.Movies {
13		movie := self.Movies[i]
14		if fn(movie) {
15			return &movie
16		}
17	}
18
19	return nil
20}
21
22func (self *MovieLibrary) FindAll(fn Predicate) []Movie {
23	items := []Movie{}
24
25	for i := range self.Movies {
26		movie := self.Movies[i]
27
28		if fn(movie) {
29			items = append(items, movie)
30		}
31	}
32
33	return items
34}
35
36func NewSpecification(p Predicate) Predicate {
37	return p
38}
39
40func MovieProducedBy(studio string) Predicate {
41	return func(m Movie) bool {
42		return m.Studio.Name == studio
43	}
44}
45
46func MovieReleasedAfter(year int) Predicate {
47	return func(m Movie) bool {
48		return m.Year > year
49	}
50}
51func MovieReleasedBefore(year int) Predicate {
52	return func(m Movie) bool {
53		return m.Year < year
54	}
55}
56
57func (self *MovieLibrary) FindAllMoviesByPixar() []Movie {
58	return self.FindAll(MovieProducedBy("Pixar"))
59}
60
61func (self *MovieLibrary) FindAllMoviesByPixarOrDisney() []Movie {
62	return self.FindAll(MovieProducedBy("Pixar").Or(MovieProducedBy("Disney")))
63}
64
65func (self *MovieLibrary) FindAllMoviesNotByPixar() []Movie {
66	return self.FindAll(MovieProducedBy("Pixar").Not())
67}
68
69func (self *MovieLibrary) FindAllMoviesPublishedAfter2004() []Movie {
70	return self.FindAll(MovieReleasedAfter(2004))
71}
72
73func (self *MovieLibrary) FindAllMoviesPublishedBetween1982And2003() []Movie {
74	return self.FindAll(MovieReleasedAfter(1982).And(MovieReleasedBefore(2003)))
75}
76
77func (self *MovieLibrary) Add(movie Movie) {
78	found := self.Find(func(x Movie) bool {
79		return x.Equals(movie)
80	})
81
82	if found != nil {
83		return
84	}
85
86	self.Movies = append(self.Movies, movie)
87}
88
89func (self *MovieLibrary) Count() int {
90	return len(self.Movies)
91}