Splice ./universe directory into ./

Manually merging:
- README.md: I added the description from universe/README.md into the heading of
  dotfiles/README.md.
- .envrc: dotfiles/.envrc was a superset of universe/.envrc
- .gitignore: Adding some of the ignored patterns from universe/.gitignore to
  dotfiles/.gitignore

Everything else here should be a simple rename.
This commit is contained in:
William Carroll 2020-01-29 14:43:20 +00:00
parent fb9380ba26
commit 5c9079a410
133 changed files with 17 additions and 7979 deletions

67
haskell-file/f-todo.org Normal file
View file

@ -0,0 +1,67 @@
* Paths
** TODO f-join (&rest args)
** TODO f-split (path)
** TODO f-expand (path &optional dir)
** TODO f-filename (path)
** TODO f-dirname (path)
** TODO f-common-parent (paths)
** TODO f-ext (path)
** TODO f-no-ext (path)
** TODO f-swap-ext (path ext)
** TODO f-base (path)
** TODO f-relative (path &optional dir)
** TODO f-short (path)
** TODO f-long (path)
** TODO f-canonical (path)
** TODO f-slash (path)
** TODO f-full (path)
** TODO f-uniquify (paths)
** TODO f-uniquify-alist (paths)
* I/O
** TODO f-read-bytes (path)
** TODO f-write-bytes (data path)
** TODO f-read-text (path &optional coding)
** TODO f-write-text(text coding path)
** TODO f-append-text(text coding path)
** TODO f-append-bytes(text coding path)
** TODO Destructive
** TODO f-mkdir (&rest dirs)
** TODO f-delete (path &optional force)
** TODO f-symlink (source path)
** TODO f-move (from to)
** TODO f-copy (from to)
** TODO f-copy-contenst (from to)
** TODO f-touch (path)
** TODO Predicates
** TODO f-exists? (path)
** TODO f-directory? (path)
** TODO f-file? (path)
** TODO f-symlink? (path)
** TODO f-readable? (path)
** TODO f-writable? (path)
** TODO f-executable? (path)
** TODO f-absolute? (path)
** TODO f-relative? (path)
** TODO f-root? (path)
** TODO f-ext? (path ext)
** TODO f-same? (path-a path-b)
** TODO f-parent-of? (path-a path-b)
** TODO f-child-of? (path-a path-b)
** TODO f-ancestor-of? (path-a path-b)
** TODO f-descendant-of? (path-a path-b)
** TODO f-hidden? (path)
** TODO f-empty? (path)
** TODO Stats
** TODO f-size (path)
** f-depth (path)
* Misc
** TODO f-this-file ()
** TODO f-path-separator ()
** TODO f-glob (pattern &optional path)
** TODO f-entries (path &optional fn recursive)
** TODO f-directories (path &optional fn recursive)
** TODO f-files (path &optional fn recursive)
** TODO f-root ()
** TODO f-traverse-upwards (fn &optional path)
** TODO f-with-sandbox (path-or-paths &rest body)

64
haskell-file/f.hs Normal file
View file

@ -0,0 +1,64 @@
module F
( join
, split
) where
--------------------------------------------------------------------------------
-- Dependencies
--------------------------------------------------------------------------------
import Data.List (span)
import System.FilePath (FilePath, pathSeparator)
import System.FilePath.Posix (FilePath)
import qualified System.FilePath.Posix as F
-- TODO: Move this to a misc.hs, prelude.hs, operators.hs; somewhere.
(|>) :: a -> (a -> b) -> b
(|>) a f = f a
infixl 1 |>
-- TODO: Move this to a test_utils.hs or elsewhere.
simpleAssert :: (Eq a) => a -> a -> ()
simpleAssert x y =
if x == y then
()
else
error "Assertion error"
--------------------------------------------------------------------------------
-- Library
--------------------------------------------------------------------------------
join :: [FilePath] -> FilePath
join = F.joinPath
-- | Split path and return list containing parts.
split :: FilePath -> [String]
split = splitJoin . span (/= pathSeparator)
where
splitJoin :: (String, String) -> [String]
splitJoin ([], []) = []
splitJoin (a, []) = [a]
splitJoin (a, [_]) = [a]
splitJoin (a, _:b) = a : split b
--------------------------------------------------------------------------------
-- Tests
--------------------------------------------------------------------------------
expected :: [([FilePath], FilePath)]
expected = [ (["path"], "path")
, (["/path"], "/path")
, (["path", "to", "file"], "path/to/file")
, (["/path", "to", "file"], "/path/to/file")
, (["/"], "/")
]
runTests :: [()]
runTests =
fmap (\(input, expected) -> simpleAssert (join input) expected) expected
main :: IO ()
main = do
print runTests
pure ()

9
haskell-file/shell.nix Normal file
View file

@ -0,0 +1,9 @@
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "f-hs";
buildInputs = [
(pkgs.haskellPackages.ghcWithPackages (pkgs: [
]))
];
}

39
haskell-file/tests.hs Normal file
View file

@ -0,0 +1,39 @@
module FTest where
--------------------------------------------------------------------------------
import Test.Tasty
import Test.Tasty.Hedgehog
import Hedgehog
--------------------------------------------------------------------------------
import qualified Hedgehog as H
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
--------------------------------------------------------------------------------
import Data.List (intercalate)
import System.FilePath (pathSeparator)
--------------------------------------------------------------------------------
import F
--------------------------------------------------------------------------------
main :: IO ()
main
= defaultMain
. localOption (HedgehogTestLimit $ Just 50)
$ testGroup "f functions"
[ test_split
]
--------------------------------------------------------------------------------
test_split :: TestTree
test_split
= testGroup "split function"
[ testProperty "splits parts properly" splitSuccess
]
splitSuccess :: Property
splitSuccess = property $ do
-- separator
-- <- H.forAll
-- $ Gen.element ['/', '\\']
parts
<- H.forAll
. Gen.list (Range.linear 0 10)
$ Gen.list (Range.linear 1 10) Gen.alphaNum
let path = intercalate [pathSeparator] parts
F.split path === parts