Commit d30c968

mo khan <mo.khan@gmail.com>
2020-11-15 02:18:00
refactor: extract Or method for predicate
1 parent b1c7c45
Changed files (2)
domain/movie_library.go
@@ -4,6 +4,10 @@ type MovieLibrary struct {
 	Movies []Movie
 }
 
+//type Specification interface {
+//IsSatisfiedBy(m Movie) bool
+//}
+
 func (self *MovieLibrary) Find(fn Predicate) *Movie {
 	for i := range self.Movies {
 		movie := self.Movies[i]
@@ -29,16 +33,22 @@ func (self *MovieLibrary) FindAll(fn Predicate) []Movie {
 	return items
 }
 
+func NewSpecification(p Predicate) Predicate {
+	return p
+}
+
+func MovieProducedBy(studio string) Predicate {
+	return func(m Movie) bool {
+		return m.Studio.Name == studio
+	}
+}
+
 func (self *MovieLibrary) FindAllMoviesByPixar() []Movie {
-	return self.FindAll(func(x Movie) bool {
-		return x.Studio.Name == "Pixar"
-	})
+	return self.FindAll(MovieProducedBy("Pixar"))
 }
 
 func (self *MovieLibrary) FindAllMoviesByPixarOrDisney() []Movie {
-	return self.FindAll(func(x Movie) bool {
-		return x.Studio.Name == "Pixar" || x.Studio.Name == "Disney"
-	})
+	return self.FindAll(MovieProducedBy("Pixar").Or(MovieProducedBy("Disney")))
 }
 
 func (self *MovieLibrary) FindAllMoviesNotByPixar() []Movie {
domain/predicate.go
@@ -1,3 +1,9 @@
 package domain
 
 type Predicate func(Movie) bool
+
+func (self Predicate) Or(other Predicate) Predicate {
+	return func(m Movie) bool {
+		return self(m) || other(m)
+	}
+}