Starting to refactor purjolok WIP
authorCameron Ball <cameron@cameron1729.xyz>
Tue, 20 Nov 2018 09:03:24 +0000 (17:03 +0800)
committerCameron Ball <cameron@cameron1729.xyz>
Tue, 20 Nov 2018 12:52:31 +0000 (20:52 +0800)
common.php
purjolok.php

index a32339d..e5424ae 100644 (file)
@@ -66,6 +66,19 @@ function formatDate($date) {
     return $date->format(DATE_FORMAT);
 }
 
+function ssort($comparitor) {
+    return function($array) use ($comparitor) {
+        uasort($array, uncurry($comparitor));
+        return $array;
+    };
+}
+
+function uncurry($f) {
+    return function($a, $b) use ($f) {
+        return $f($a)($b);
+    };
+}
+
 const sendToGroupChat = 'sendToGroupChat';
 function sendToGroupChat(string $message) {
     return getTelegram()->sendMessage(['chat_id' => CHAT_ID, 'text' => $message]);
@@ -86,6 +99,24 @@ function messageNeedsReminder($message) {
     return $message['due']->diff(new DateTimeImmutable)->d == REMIND_THRESHOLD;
 }
 
+const unlines = 'unlines';
+function unlines($lines) {
+    return implode("\n", $lines);
+}
+
+function field($field) {
+    return function($array) use ($field) {
+        return $array[$field];
+    };
+}
+
+const ⬄ = '⬄';
+function ⬄($a) {
+    return function($b) use ($a) {
+        return $a <=> $b;
+    };
+}
+
 
 function ∘(...$fs) {
     return function($arg) use ($fs) {
@@ -101,12 +132,42 @@ function map($callable) {
     };
 }
 
+function aaray_column($column) {
+    return function($array) use ($column) {
+        return array_column($array, $column);
+    };
+}
+
+function aaray_slice($start) {
+    return function($length) use ($start) {
+        return function($array) use ($length, $start) {
+            return array_slice($array, $start, $length);
+        };
+    };
+}
+
 function filter($callable) {
     return function($list) use ($callable) {
         return array_filter($list, $callable);
     };
 }
 
+function f∘(callable $f) {
+    return function(callable $g) use ($f) {
+        return function($arg) use($g, $f) {
+            return $f($g($arg));
+        };
+    };
+}
+
+function ∘f(callable $f) {
+    return function(callable $g) use ($f) {
+        return function($arg) use($g, $f) {
+            return $g($f($arg));
+        };
+    };
+}
+
 function ∪($a, $b) {
     return array_merge($a, $b);
 }
index 185da44..4566cea 100644 (file)
@@ -19,20 +19,17 @@ getTelegram()->addCommand(
         protected $description = 'Search through the movie collection';
 
         public function handle($arguments) {
-            $results = array_map(
-                function($moviename) use ($arguments) {
-                    similar_text($arguments, substr($moviename, 0, -7) ?: '', $perc);
-                    return ['title' => $moviename, 'similarity' => $perc];
-            },
-                scandir('/mnt/media/Movies')
+            $top5 = ∘(unlines, aaray_column('title'), aaray_slice(0)(5), 'array_reverse', 'array_values', ssort(∘(∘f(field('similarity')), ⬄, field('similarity'))));
+            $movies = map(function($movie) use ($arguments) {
+                similar_text($arguments, substr($movie, 0, -7) ?: '', $perc);
+                return ['title' => $movie, 'similarity' => $perc];
+            })(scandir('/mnt/media/Movies'));
+
+            $this->replyWithMessage(
+                [
+                    'text' => "Here are the most similar movies titles I could find...\n\n" . $top5($movies)
+                ]
             );
-
-            uasort($results, function($a, $b) {
-                return $b['similarity'] <=> $a['similarity'];
-            });
-
-            $results = array_column(array_slice(array_values($results), 0, 5), 'title');
-            $this->replyWithMessage(['text' => "Here are the most similar movies titles I could find...\n\n" . implode("\n", $results)]);
         }
     }
 );