subtree(users/wpcarro): docking briefcase at '24f5a642'
git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
This commit is contained in:
commit
019f8fd211
766 changed files with 175420 additions and 0 deletions
2
users/wpcarro/haskell-file/.envrc
Normal file
2
users/wpcarro/haskell-file/.envrc
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
source_up
|
||||
use_nix
|
||||
7
users/wpcarro/haskell-file/README.md
Normal file
7
users/wpcarro/haskell-file/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# haskell-file
|
||||
|
||||
This is a half-baked project. I'd like to write a library whose API closely
|
||||
resembles some of the more modern filesystem APIs to which I am accustomed:
|
||||
notably f.el for Elisp.
|
||||
|
||||
I expect more development to come.
|
||||
67
users/wpcarro/haskell-file/f-todo.org
Normal file
67
users/wpcarro/haskell-file/f-todo.org
Normal 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
users/wpcarro/haskell-file/f.hs
Normal file
64
users/wpcarro/haskell-file/f.hs
Normal 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 ()
|
||||
5
users/wpcarro/haskell-file/shell.nix
Normal file
5
users/wpcarro/haskell-file/shell.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
let
|
||||
briefcase = import <briefcase> {};
|
||||
in briefcase.buildHaskell.shell {
|
||||
deps = hpkgs: [];
|
||||
}
|
||||
39
users/wpcarro/haskell-file/tests.hs
Normal file
39
users/wpcarro/haskell-file/tests.hs
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue