Programming in handstand

Preview:

DESCRIPTION

An example demonstrating how to have fun while learning new concepts in the art of software development.

Citation preview

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!

Recommended