From e33627f960c767c7408a4885a0061ade2703c9f9 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 8 May 2020 18:55:00 +0100 Subject: [PATCH] feat(fun/dt): Implement useful utility --- fun/dt/CMakeLists.txt | 16 +++++++++++++ fun/dt/README.md | 11 +++++++++ fun/dt/default.nix | 14 +++++++++++ fun/dt/dt.cc | 56 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 fun/dt/CMakeLists.txt create mode 100644 fun/dt/README.md create mode 100644 fun/dt/default.nix create mode 100644 fun/dt/dt.cc diff --git a/fun/dt/CMakeLists.txt b/fun/dt/CMakeLists.txt new file mode 100644 index 000000000..85b659fea --- /dev/null +++ b/fun/dt/CMakeLists.txt @@ -0,0 +1,16 @@ +# -*- mode: cmake; -*- +cmake_minimum_required(VERSION 3.16) +project(dt) +add_executable(dt dt.cc) +find_package(absl REQUIRED) + +target_link_libraries(dt + absl::flags + absl::flags_parse + absl::hash + absl::time + absl::strings + farmhash +) + +install(TARGETS dt DESTINATION bin) diff --git a/fun/dt/README.md b/fun/dt/README.md new file mode 100644 index 000000000..ee43d5606 --- /dev/null +++ b/fun/dt/README.md @@ -0,0 +1,11 @@ +dt +== + +It's got a purpose. + +## Usage: + +``` +nix-build -E '(import (builtins.fetchGit "https://git.tazj.in/") {}).fun.dt' +./result/bin/dt --one ... --two ... +``` diff --git a/fun/dt/default.nix b/fun/dt/default.nix new file mode 100644 index 000000000..4dbf00ede --- /dev/null +++ b/fun/dt/default.nix @@ -0,0 +1,14 @@ +{ depot, pkgs, ... }: + +let + stdenv = with pkgs; overrideCC clangStdenv clang_9; + abseil-cpp = pkgs.abseil-cpp.override { inherit stdenv; }; +in stdenv.mkDerivation { + name = "dt"; + src = ./.; + nativeBuildInputs = [ pkgs.cmake ]; + buildInputs = with pkgs; [ + abseil-cpp + farmhash + ]; +} diff --git a/fun/dt/dt.cc b/fun/dt/dt.cc new file mode 100644 index 000000000..895dc3405 --- /dev/null +++ b/fun/dt/dt.cc @@ -0,0 +1,56 @@ +#include + +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" +#include "absl/hash/hash.h" +#include "absl/time/time.h" +#include "absl/time/clock.h" +#include "absl/strings/str_cat.h" +#include "farmhash.h" + +ABSL_FLAG(std::string, one, "", "first word"); +ABSL_FLAG(std::string, two, "", "second word"); +ABSL_FLAG(int, range, 100, "operating range"); + +void which(std::string one, std::string two) { + if (util::Fingerprint64(one) > util::Fingerprint64(two)) { + std::cout << one << std::endl; + } else { + std::cout << two << std::endl; + } +} + +std::string decide(std::string one, std::string two) { + auto date = absl::FormatTime("%Y%m%d", absl::Now(), absl::UTCTimeZone()); + auto base = util::Fingerprint64(absl::StrCat(date, one, two)) + % (absl::GetFlag(FLAGS_range) + 1); + + if (base % 10 == 0) { + return "c2"; + } else if (base % 9 == 0) { + which(one, two); + return "c1"; + } else if (base % 8 == 0) { + return "e2"; + } else if (base % 7 == 0) { + which(one, two); + return "e1"; + } else if (base % 3 == 0) { + return "skip"; + } + + return "nope"; +} + +int main(int argc, char *argv[]) { + absl::ParseCommandLine(argc, argv); + auto one = absl::GetFlag(FLAGS_one); + auto two = absl::GetFlag(FLAGS_two); + + if (one.empty() || two.empty()) { + std::cerr << "both are required!" << std::endl; + return 1; + } + + std::cout << decide(one, two) << std::endl; +}