From c85e45aaee1252b48fea6a758937043d69145f2c Mon Sep 17 00:00:00 2001 From: Artur Manuel Date: Wed, 15 Jan 2025 01:57:39 +0000 Subject: [PATCH] feat(repo): initialise repository --- .envrc | 1 + .gitignore | 3 +++ CHANGELOG.md | 5 ++++ LICENSE | 14 ++++++++++ app/Main.hs | 65 +++++++++++++++++++++++++++++++++++++++++++++++ flake.lock | 62 ++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 39 ++++++++++++++++++++++++++++ flake/package.nix | 4 +++ flake/shell.nix | 14 ++++++++++ flake/treefmt.nix | 5 ++++ hetch.cabal | 25 ++++++++++++++++++ 11 files changed, 237 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 app/Main.hs create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 flake/package.nix create mode 100644 flake/shell.nix create mode 100644 flake/treefmt.nix create mode 100644 hetch.cabal diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..7e5fd88 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake ".#" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c430736 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +dist-newstyle +.direnv +*~ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f021823 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for cool-haskell-project + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ee7d6a5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..e050b6c --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,65 @@ +module Main where + +import Data.List (isPrefixOf) +import Data.Maybe (fromMaybe) +import System.Environment (lookupEnv) +import System.IO (readFile') + +readUptime :: String -> Int +readUptime "" = 0 +readUptime uptime + | length (words uptime) > 1 = floor (read . head . words $ uptime :: Float) + | otherwise = floor (read uptime :: Float) + +getUptime :: Int -> String +getUptime uptime + | uptime < 60 = remS + | uptime < 3600 = unwords [remM, remS] + | otherwise = unwords [remH, remM, remS] + where + totalM = uptime `div` 60 + remS = show (uptime `mod` 60) ++ "s" + remM = show (totalM `mod` 60) ++ "m" + remH = show (totalM `div` 60) ++ "h" + +getKVer :: String -> String +getKVer "" = "" +getKVer info + | length (words info) < 3 = head (words info) + | otherwise = (\(k : ks) -> k ++ " " ++ (head . tail) ks) . words $ info + +findPrettyName :: [String] -> String +findPrettyName (o : os) + | "PRETTY_NAME" `isPrefixOf` o = (reverse . tail . init . takeWhile (/= '=') . reverse) o + | otherwise = findPrettyName os + +parseKBFromMeminfo :: String -> Int +parseKBFromMeminfo "" = 0 +parseKBFromMeminfo line = read (head . tail . words $ line) :: Int + +getMemory :: String -> String +getMemory meminfo + | length (lines meminfo) < 2 = "N/A" + | otherwise = memAvail ++ "/" ++ memTotal + where + memTotal = show (parseKBFromMeminfo (head $ lines meminfo) `div` 1000) ++ "MB" + memAvail = show (parseKBFromMeminfo (head . tail . tail $ lines meminfo) `div` 1000) ++ "MB" + +main :: IO () +main = do + uptime <- readFile' "/proc/uptime" + version <- readFile' "/proc/version" + osRelease <- readFile' "/etc/os-release" + hostname <- readFile' "/proc/sys/kernel/hostname" + meminfo <- readFile' "/proc/meminfo" + username <- lookupEnv "USER" + putStr + ( unlines + [ "\x1b[1;35m █ \x1b[1;34m" ++ fromMaybe "username" username ++ "@" ++ init hostname + , "\x1b[1;35m █ \x1b[1;34m" + , "\x1b[1;35m █ \x1b[1;34m" ++ "up\t" ++ (getUptime . readUptime) uptime + , "\x1b[1;35m ███ \x1b[1;34m" ++ "krl\t" ++ getKVer version + , "\x1b[1;35m █ ██ \x1b[1;34m" ++ "os\t" ++ (findPrettyName . lines) osRelease + , "\x1b[1;35m █ ██ \x1b[1;34m" ++ "mem\t" ++ getMemory meminfo + ] + ) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b4f7f72 --- /dev/null +++ b/flake.lock @@ -0,0 +1,62 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1733212471, + "narHash": "sha256-M1+uCoV5igihRfcUKrr1riygbe73/dzNnzPsmaLCmpo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "55d15ad12a74eb7d4646254e13638ad0c4128776", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1731890469, + "narHash": "sha256-D1FNZ70NmQEwNxpSSdTXCSklBH1z2isPR84J6DQrJGs=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5083ec887760adfe12af64830a66807423a859a7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "treefmt": "treefmt" + } + }, + "treefmt": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1733222881, + "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "49717b5af6f80172275d47a418c9719a31a78b53", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6426c0f --- /dev/null +++ b/flake.nix @@ -0,0 +1,39 @@ +{ + description = "Haskell Project Template"; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + treefmt.url = "github:numtide/treefmt-nix"; + }; + outputs = + inputs@{ nixpkgs, ... }: + let + inherit (nixpkgs) lib; + systems = [ "x86_64-linux" ]; + forAllSystems = + f: + lib.genAttrs systems ( + system: + f { + pkgs = import nixpkgs { + inherit system; + }; + } + ); + treefmtEval = forAllSystems ({ pkgs }: inputs.treefmt.lib.evalModule pkgs ./flake/treefmt.nix); + in + { + packages = forAllSystems ( + { pkgs }: + { + default = pkgs.callPackage ./flake/package.nix { }; + } + ); + devShells = forAllSystems ( + { pkgs }: + { + default = pkgs.callPackage ./flake/shell.nix { }; + } + ); + formatter = forAllSystems ({ pkgs }: treefmtEval.${pkgs.system}.config.build.wrapper); + }; +} diff --git a/flake/package.nix b/flake/package.nix new file mode 100644 index 0000000..a86f792 --- /dev/null +++ b/flake/package.nix @@ -0,0 +1,4 @@ +{ haskellPackages }: +haskellPackages.developPackage { + root = ../.; +} diff --git a/flake/shell.nix b/flake/shell.nix new file mode 100644 index 0000000..6f3446a --- /dev/null +++ b/flake/shell.nix @@ -0,0 +1,14 @@ +{ + mkShell, + haskellPackages, +}: +mkShell { + name = "haskell"; + packages = builtins.attrValues { + inherit (haskellPackages) + haskell-language-server + ormolu + ghc + ; + }; +} diff --git a/flake/treefmt.nix b/flake/treefmt.nix new file mode 100644 index 0000000..398aa83 --- /dev/null +++ b/flake/treefmt.nix @@ -0,0 +1,5 @@ +_: { + projectRootFile = ".git/config"; + programs.nixfmt.enable = true; + programs.ormolu.enable = true; +} diff --git a/hetch.cabal b/hetch.cabal new file mode 100644 index 0000000..9928c59 --- /dev/null +++ b/hetch.cabal @@ -0,0 +1,25 @@ +cabal-version: 3.0 +name: hetch +version: 0.1.0.0 +-- synopsis: +-- description: +license: WTFPL +license-file: LICENSE +author: Artur Manuel +maintainer: balkenix@outlook.com +-- copyright: +build-type: Simple +extra-doc-files: CHANGELOG.md +-- extra-source-files: + +common warnings + ghc-options: -Wall + +executable hetch + import: warnings + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base ^>=4.18.2.1 + hs-source-dirs: app + default-language: GHC2021