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}