programming in handstand
DESCRIPTION
An example demonstrating how to have fun while learning new concepts in the art of software development.TRANSCRIPT
Programming in handstand
PHP Meetup, 2014. 04. 23.
Programming in handstand
Attila Magyar (@athoshun)http://athoshun.eu
2/149
Programming in handstand
Attila Magyar (@athoshun)http://athoshun.eu
http://balabit.com
3/149
Programming in handstand
Attila Magyar (@athoshun)http://athoshun.eu
http://balabit.com
Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org
4/149
Programming in handstand
Attila Magyar (@athoshun)http://athoshun.eu
http://balabit.com
Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org
http://coderetreat.orghttp://www.meetup.com/Coderetreat-Budapest/
5/149
Programming in handstand
Attila Magyar (@athoshun)http://athoshun.eu
http://balabit.com
Rafael Ördög (@devillsroom)http://c0de-x.comhttp://leanpoker.org
http://coderetreat.orghttp://www.meetup.com/Coderetreat-Budapest/
Gergely Nagy (@algernoone)http://asylum.madhouse-project.org/http://syslog-ng.org/
6/149
FizzBuzz
Write a program that iterates through the numbers from 1 to 100 and:
For multiples of 3 print "Fizz" For multiples of 5 print "Buzz" For numbers which are multiples of both 3
and 5 print "FizzBuzz" For others, print the number itself
7/149
FizzBuzz
Write a program that iterates through the numbers from 1 to 100 and:
For multiples of 3 print "Fizz" For multiples of 5 print "Buzz" For numbers which are multiples of both 3
and 5 print "FizzBuzz" For others, print the number itself
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz,11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19,Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28,29, FizzBuzz, ...
8/149
FizzBuzz
for ($i = 0; $i < 100; ++$i) {
if ($i % 3 === 0) { print "Fizz"; } if ($i % 5 === 0) { print "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { print $i; }
print ", "; }
9/149
FizzBuzz
for ($i = 0; $i < 100; ++$i) {
if ($i % 3 === 0) { print "Fizz"; } if ($i % 5 === 0) { print "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { print $i; }
print ", "; }
10/149
FizzBuzzfunction fizzbuzz(){ $sequence = array();
for ($i = 0; $i < 100; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
11/149
FizzBuzzfunction fizzbuzz(){ $sequence = array();
for ($i = 0; $i < 100; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
12/149
FizzBuzzfunction fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
13/149
FizzBuzzfunction fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($i % 3 !== 0 && $i % 5 !== 0) { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
14/149
FizzBuzzfunction fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
15/149
FizzBuzzBeepfunction fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
16/149
FizzBuzzBeepfunction fizzbuzz($with_beep = false){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) $formatted .= "Fizz"; if ($i % 5 === 0) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
17/149
FizzBuzzBeepfunction fizzbuzz($with_beep = false, $with_digits = false){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0 || ($with_digits ...)) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
18/149
FizzBuzzBeepfunction fizzbuzz($with_beep = false, $with_digits = false){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && $i % 7 === 0 || ($with_digits ...)) $formatted .= "Beep"; if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
19/149
No loops!20/149
No loops!21/149
No loops!function fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
22/149
No loops!function fizzbuzz($i = 1, array $result = array()){ if ($i > 100) return $result;
$formatted = ""; if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }
return fizzbuzz( $i + 1, array_merge($result, array($formatted)) );}
23/149
No loops!function fizzbuzz($i = 1, array $result = array()){ if ($i > 100) return $result;
$formatted = ""; if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }
return fizzbuzz( $i + 1, array_merge($result, array($formatted)) );}
PHP Fatal error: Maximumfunction nesting levelof '100' Reached, aborting!
24/149
No loops!function fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
25/149
array_map($callable, $array)function fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
array_map( function ($x) { return 2*$x; }, array(1, 2, 3));
// array(2, 4, 6)
26/149
No loops!function fizzbuzz(){ $sequence = array();
for ($i = 1; $i < 101; ++$i) { $formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
$sequence[] = $formatted; }
return $sequence;}
array_map( function ($x) { return 2*$x; }, array(1, 2, 3));
// array(2, 4, 6)
27/149
No loops!function fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
return $formatted; }, range(1, 100) );}
array_map( function ($x) { return 2*$x; }, array(1, 2, 3));
// array(2, 4, 6)
28/149
No loops!function fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
return $formatted; }, range(1, 100) );}
29/149
Still complex, rigidfunction fizzbuzz($with_beep = false, $with_digits = false){ return array_map( function ($i) use ($with_beep, $with_digits) {
$formatted = "";
if ($i % 3 === 0 || ($with_digits && strpos...)) $formatted .= "Fizz"; if ($i % 5 === 0 || ($with_digits && strpos...)) $formatted .= "Buzz"; if ($with_beep && (...)) $formatted .= "Buzz"; if ($formatted === "") $formatted = "$i";
return $formatted; }, range(1, 100) );}
30/149
No conditional statements!function fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
return $formatted; }, range(1, 100) );}
31/149
Create some duplicationfunction fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
return $formatted; }, range(1, 100) );}
32/149
Create some duplicationfunction fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted = "$i"; }
return $formatted; }, range(1, 100) );}
33/149
Uniformizefunction fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }
return $formatted; }, range(1, 100) );}
34/149
Scalar vector→function fizzbuzz(){ return array_map( function ($i) {
$formatted = "";
if ($i % 3 === 0) { $formatted .= "Fizz"; } if ($i % 5 === 0) { $formatted .= "Buzz"; } if ($formatted === "") { $formatted .= "$i"; }
return $formatted; }, range(1, 100) );}
35/149
Scalar vector→function fizzbuzz(){ return array_map( function ($i) {
$formatted = array();
if ($i % 3 === 0) { $formatted[] = "Fizz"; } if ($i % 5 === 0) { $formatted[] = "Buzz"; } if (count($formatted) === 0) { $formatted[] = "$i"; }
return implode($formatted); }, range(1, 100) );}
36/149
Extract conditionfunction fizzbuzz(){ return array_map( function ($i) {
$formatted = array();
if ($i % 3 === 0) { $formatted[] = "Fizz"; } if ($i % 5 === 0) { $formatted[] = "Buzz"; } if (count($formatted) === 0) { $formatted[] = "$i"; }
return implode($formatted); }, range(1, 100) );}
37/149
Extract conditionfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; if ($condition) { $formatted[] = "Fizz"; } $condition = $i % 5 === 0; if ($condition) { $formatted[] = "Buzz"; } $condition = count($formatted) === 0; if ($condition) { $formatted[] = "$i"; } return implode($formatted); }, range(1, 100) );}
38/149
Extract representationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; if ($condition) { $formatted[] = "Fizz"; } $condition = $i % 5 === 0; if ($condition) { $formatted[] = "Buzz"; } $condition = count($formatted) === 0; if ($condition) { $formatted[] = "$i"; } return implode($formatted); }, range(1, 100) );}
39/149
Extract representationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;
$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
40/149
Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;
$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
41/149
Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $condition = $i % 3 === 0; $representation = "Fizz"; if ($condition) $formatted[] = $representation;
$condition = $i % 5 === 0; $representation = "Buzz"; if ($condition) $formatted[] = $representation;
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
42/149
Eliminate duplicationfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));
foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
43/149
array_filter($array, $callable)function fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));
foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
array_filter(array(1, 2, 3, 4), function ($x) { return $x > 2; });
// array(3, 4)
44/149
Eliminate conditionalfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"));
foreach ($rules as $rule) { list($condition, $representation) = $rule; if ($condition) $formatted[] = $representation; }
$condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
45/149
Eliminate conditionalfunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) { list($condition, $representation) = $rule; $formatted[] = $representation; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
46/149
Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) { list($condition, $representation) = $rule; $formatted[] = $representation; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
47/149
Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {
$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
48/149
Remove some noisefunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {
$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
49/149
Zoom infunction fizzbuzz(){ return array_map( function ($i) { $formatted = array(); $rules = array_filter( array(array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz")), function (array $rule) { return $rule[0]; }); foreach ($rules as $rule) {
$formatted[] = $rule[1]; } $condition = count($formatted) === 0; $representation = "$i"; if ($condition) $formatted[] = $representation;
return implode($formatted); }, range(1, 100) );}
50/149
Zoom in$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$condition = count($formatted) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}
return implode($formatted);
51/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$condition = count($formatted) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}
return implode($formatted);
52/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$condition = count($rules) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}
return implode($formatted);
53/149
Uniformize$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$condition = count($rules) === 0;$representation = "$i";if ($condition) { $formatted[] = $representation;}
return implode($formatted);
54/149
Uniformize$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$rule = array(count($rules) === 0, "$i");
if ($rule[0]) { $formatted[] = $rule[1];}
return implode($formatted);
55/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
$rule = array(count($rules) === 0, "$i");
if ($rule[0]) { $formatted[] = $rule[1];}
return implode($formatted);
56/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}
return implode($formatted);
57/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
foreach ($rules as $rule) { $formatted[] = $rule[1];}
if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}
return implode($formatted);
58/149
$formatted $rules→$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
59/149
Remove some redundancy$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(count($rules) === 0, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
60/149
Remove some redundancy$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(true, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
61/149
array_pad($array, $size, $value)$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(true, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
array_pad(array(1, 2), 5, 42); // array(1, 2, 42, 42, 42)
array_pad(array(1, 2), 1, 42); // array(1, 2)
62/149
array_pad(array(1, 2), 5, 42); // array(1, 2, 42, 42, 42)
array_pad(array(1, 2), 1, 42); // array(1, 2)
Padding$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(true, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
63/149
Padding$formatted = array();$rules = array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; });
if (count($rules) === 0) { $rules[] = array(true, "$i");}
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
64/149
Padding$formatted = array();$rules = array_pad(array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
65/149
Padding$formatted = array();$rules = array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
66/149
foreach array_map()→$formatted = array();$rules = array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i"));
foreach ($rules as $rule) { $formatted[] = $rule[1];}
return implode($formatted);
67/149
foreach array_map()→$formatted = array_map(function(array $rule){return $rule[1];}, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i")));
return implode($formatted);
68/149
foreach array_map→$formatted = array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ));
return implode($formatted);
69/149
inline implode$formatted = array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ));
return implode($formatted);
70/149
inline implodereturn implode(array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") )));
71/149
inline implodereturn implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));
72/149
Eliminate unneeded valuesreturn implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));
73/149
array_pad() array_map()↔return implode( array_map( function (array $rule) { return $rule[1]; }, array_pad( array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), 1, array(true, "$i") ) ));
74/149
array_pad() array_map()↔return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
75/149
array_map() for_all()→return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
76/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
77/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
78/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
79/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
80/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
81/149
array_map() for_all()→
return implode( array_pad( array_map( function (array $rule) { return $rule[1]; }, array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ) ), 1, "$i" ));
82/149
array_map() for_all()→function for_all(array $items, $action){ return array_map($action, $items);}
return implode( array_pad( for_all(
array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), function (array $rule) { return $rule[1]; } ), 1, "$i" ));
83/149
array_filter matching_rules→function for_all(array $items, $action){ return array_map($action, $items);}
return implode( array_pad( for_all(
array_filter( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), ), function (array $rule) { return $rule[0]; } ), function (array $rule) { return $rule[1]; } ), 1, "$i" ));
84/149
array_filter matching_rules→function matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), function (array $rule) { return $rule[1]; } ), 1, "$i" ));
85/149
For all matching rules...function matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), function (array $rule) { return $rule[1]; } ), 1, "$i" ));
86/149
select representation
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), function (array $rule) { return $rule[1]; } ), 1, "$i" ));
87/149
select representation$select_representation = function (array $rule) { return $rule[1]; };
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), $select_representation ), 1, "$i" ));
88/149
select representationfunction select_representation(){ return function (array $rule) { return $rule[1]; };}
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ), 1, "$i" ));
89/149
array_pad() either_or_else()→function select_representation(){ return function (array $rule) { return $rule[1]; };}
return implode( array_pad( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ), 1, "$i" ));
90/149
array_pad() either_or_else()→function either_or_else(array $either, $or_else){ return array_pad($either, 1, $or_else);}
return implode( either_or_else( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ),
"$i" ));
91/149
implode() concat()→function either_or_else(array $either, $or_else){ return array_pad($either, 1, $or_else);}
return implode( either_or_else( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ),
"$i" ));
92/149
implode() concat()→function concat(array $parts){ return implode($parts);}
return concat( either_or_else( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ),
"$i" ));
93/149
Parametric rules: conditionsfunction concat(array $parts){ return implode($parts);}
return concat( either_or_else( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ),
"$i" ));
94/149
Parametric rules: conditionsfunction matching_rules(array $rules) { return array_filter( $rules, function (array $rule) { return $rule[0]; }); }
return concat( either_or_else( for_all(
matching_rules( array( array($i % 3 === 0, "Fizz"), array($i % 5 === 0, "Buzz"), )
), select_representation() ),
"$i" ));
95/149
Parametric rules: conditionsfunction matching_rules($n, array $rules) { return array_filter( $rules, function (array $rule) use ($n) {return $rule[0]($n);});}
return concat( either_or_else( for_all( matching_rules( $i, array( array(function ($n) { return $n%3 === 0; }, "Fizz"), array(function ($n) { return $n%5 === 0; }, "Buzz"), ) ), select_representation() ), "$i" ));
96/149
Remove duplicationfunction matching_rules($n, array $rules) { return array_filter( $rules, function (array $rule) use ($n) {return $rule[0]($n);});}
return concat( either_or_else( for_all( matching_rules( $i, array( array(function ($n) { return $n%3 === 0; }, "Fizz"), array(function ($n) { return $n%5 === 0; }, "Buzz"), ) ), select_representation() ), "$i" ));
97/149
Remove duplicationfunction is_multiple_of($divisor) { return function ($n) use ($divisor) { return $n % $divisor === 0; };}
return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), "Fizz"), array(is_multiple_of(5), "Buzz"), ) ), select_representation() ), "$i" ));
98/149
Parametric representationfunction is_multiple_of($divisor) { return function ($n) use ($divisor) { return $n % $divisor === 0; };}
return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), "Fizz"), array(is_multiple_of(5), "Buzz"), ) ), select_representation() ), "$i" ));
99/149
Parametric representation
return concat( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), function ($n) { return "Fizz"; }), array(is_multiple_of(5), function ($n) { return "Buzz"; }), ) ), select_representation() ), function ($n) { return "$n"; } ));
100/149
Parametric representation
return concat(for_all( either_or_else( for_all( matching_rules( $i, array( array(is_multiple_of(3), function ($n) { return "Fizz"; }), array(is_multiple_of(5), function ($n) { return "Buzz"; }), ) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); }));
101/149
Parametric representation
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));
102/149
Parametric actionfunction select_representation() { return function (array $rule) { return $rule[1]; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_representation() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));
103/149
Parametric actionfunction select_action() { return function (array $rule) { return $rule[1]; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));
104/149
Parametric actionfunction select_action() { return function (array $rule) { return $rule[1]; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));
105/149
Parametric action
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), function ($f) use ($i) { return $f($i); } ));
106/149
Parametric actionfunction apply_with($n) { return function ($f) use ($n) { return $f($n); };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));
107/149
Parametric actionfunction apply_with($n) { return function ($f) use ($n) { return $f($n); };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));
108/149
Remove duplication
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), function ($n){return "Fizz";}), array(is_multiple_of(5), function ($n){return "Buzz";}),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));
109/149
Remove duplicationfunction const_fn($const) { return function ($n) use ($const) { return $const; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));
110/149
Name thingsfunction const_fn($const) { return function ($n) use ($const) { return $const; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), function ($n) { return "$n"; } ), apply_with($i) ));
111/149
Name thingsfunction to_string() { return function ($n) { return "$n"; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));
112/149
Encapsulationfunction to_string() { return function ($n) { return "$n"; };}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(array(is_multiple_of(3), const_fn("Fizz")), array(is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));
113/149
Encapsulationfunction when($condition, $action) { return array($condition, $action);}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), const_fn("Fizz")), when( is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));
114/149
When ... then ...function when($condition, $action) { return array($condition, $action);}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), const_fn("Fizz")), when( is_multiple_of(5), const_fn("Buzz")),) ), select_action() ), to_string() ), apply_with($i) ));
115/149
When ... then ...function then($action) { return $action;}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), then(const_fn("Fizz"))), when( is_multiple_of(5), then(const_fn("Buzz"))),) ), select_action() ), to_string() ), apply_with($i) ));
116/149
Extract ugly detailsfunction then($action) { return $action;}
return concat( for_all( either_or_else( for_all( matching_rules( $i, array(when( is_multiple_of(3), then(const_fn("Fizz"))), when( is_multiple_of(5), then(const_fn("Buzz"))),) ), select_action() ), to_string() ), apply_with($i) ));
117/149
Extract ugly detailsfunction apply_rules($n, array $rules, $otherwise_fn){ return concat( for_all( either_or_else( for_all(matching_rules($n, $rules), select_action()), $otherwise_fn ), apply_with($n) ) );}
return apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string());
118/149
Extract ugly detailsfunction apply_rules($n, array $rules, $otherwise_fn){ return concat( for_all( either_or_else( for_all(matching_rules($n, $rules), select_action()), $otherwise_fn ), apply_with($n) ) );}
return apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string());
119/149
Extract ugly details
function fizzbuzz(){ return for_all( range(1, 100), function ($i) { apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() ) } );}
120/149
Extract ugly details
function fizzbuzz(){ return for_all( range(1, 100), function ($i) { apply_rules( $i, array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() ) } );}
121/149
Extract ugly detailsfunction apply_rules(array $rules, $otherwise_fn) { return function ($n) use ($rules, $otherwise_fn) { return concat(for_all( ... )); };}function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() )
);}
122/149
Readability refinementsfunction apply_rules(array $rules, $otherwise_fn) { return function ($n) use ($rules, $otherwise_fn) { return concat(for_all( ... )); };}function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), to_string() )
);}
123/149
Readability refinementsfunction otherwise($action) { return $action;}
function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(to_string()) )
);}
124/149
Readability refinementsfunction otherwise($action) { return $action;}
function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(to_string()) )
);}
125/149
Readability refinementsfunction otherwise($action) { return $action;}
function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(convert_to_string()) )
);}
126/149
Extract, extract, extract
function fizzbuzz(){ return for_all( range(1, 100), apply_rules(
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), ), otherwise(convert_to_string()) )
);}
127/149
Extract, extract, extractfunction format_numbers(array $rules) { return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return
array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), )
;}
128/149
The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}
129/149
The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}
130/149
The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
131/149
The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return array( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))), );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
132/149
The resulting algorithmfunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}function rules(){ return func_get_args();}
133/149
SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}
134/149
SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzzbeep_rules(){ return append( fizzbuzz_rules(), when(is_multiple_of(7), then(const_fn("Beep"))) );}
135/149
SOLID: Open/Closed Principlefunction format_numbers(array $rules){ return for_all(range(1, 100), apply_rules($rules, otherwise(convert_to_string())));}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzzbeep_rules(){ return append( fizzbuzz_rules(), when(is_multiple_of(7), then(const_fn("Beep"))) );}function append(array $array, $item) { ... }
136/149
SOLID: What about the others?function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
137/149
SOLID: Single Responsibilityfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
138/149
SOLID: Single Responsibility ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
139/149
SOLID: Liskov Substitutionfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
140/149
SOLID: Liskov Substitution ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
141/149
SOLID: Interface Segregationfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
142/149
SOLID: Interface Segregation ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
143/149
SOLID: Dependency Inversionfunction format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
144/149
SOLID: Dependency Inversion ✓function format_numbers(array $rules){ return for_all( range(1, 100), apply_rules( $rules, otherwise(convert_to_string()) ) );}function fizzbuzz_rules(){ return rules( when(is_multiple_of(3), then(const_fn("Fizz"))), when(is_multiple_of(5), then(const_fn("Buzz"))) );}function fizzbuzz(){ return format_numbers(fizzbuzz_rules());}
145/149
Wait a sec: isn't SOLID for OOP?146/149
Wait a sec: isn't SOLID for OOP?
If you have OO, you can have FP: Iterator Lazy evaluation→ Iterator, Command Map, Filter→ Command, Factory High order functions→ Immutability Composition Over Inheritance
147/149
Get out of your comfort zone
And extend your mental toolbox!
Thank you!