hpath: Support for well-typed paths

[ bsd3, filesystem ] [ Propose Tags ]

Support for well-typed paths, utilizing ByteString under the hood.

[Skip to Readme]
Versions [faq] 0.5.9, 0.6.0, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7.5, 0.8.0, 0.8.1, 0.9.0, 0.9.1, 0.9.2, 0.10.0, 0.10.1, 0.10.2, 0.11.0 (info)
Change log CHANGELOG
Dependencies base (>=4.2 && <5), bytestring (>=, deepseq, exceptions, hspec, simple-sendfile (>=0.2.22), unix (>=2.5), unix-bytestring, utf8-string, word8 [details]
License GPL-2.0-only
Copyright Julian Ospald 2016
Author Julian Ospald <hasufell@posteo.de>
Maintainer Julian Ospald <hasufell@posteo.de>
Revised Revision 1 made by GeorgeWilson at 2018-04-12T00:21:17Z
Category Filesystem
Source repo head: git clone https://github.com/hasufell/hpath
Uploaded by maerwald at 2016-05-18T12:11:35Z
Distributions NixOS:0.11.0
Downloads 5523 total (61 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2016-05-18 [all 1 reports]




Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Readme for hpath-0.7.0

[back to package description]


Build Status

Support for well-typed paths in Haskell. Also provides ByteString based filepath manipulation.


The motivation came during development of hsfm which has a pretty strict File type, but lacks a strict Path type, e.g. for user input.

The library that came closest to my needs was path, but the API turned out to be oddly complicated for my use case, so I decided to fork it.

Similarly, posix-paths was exactly what I wanted for the low-level operations, but upstream seems dead, so it is forked as well and merged into this library.


  • well-typed paths
  • high-level API to file operations like recursive directory copy
  • safe filepath manipulation, never using String as filepath, but ByteString
  • still allowing sufficient control to interact with the underlying low-level calls

Differences to 'path'

  • doesn't attempt to fake IO-related information into the path, so whether a path points to a file or directory is up to your IO-code to decide...
  • trailing path separators will be preserved if they exist, no messing with that
  • uses safe ByteString for filepaths under the hood instead of unsafe String
  • fixes broken dirname
  • renames dirname/filename to basename/dirname to match the POSIX shell functions
  • introduces a new Path Fn for safe filename guarantees and a RelC class
  • allows pattern matching via unidirectional PatternSynonym
  • uses simple doctest for testing
  • allows ~/ as relative path, because on posix level ~ is just a regular filename that does NOT point to $HOME
  • remove TH, it sucks

Differences to 'posix-paths'

  • hasTrailingPathSeparator behaves in the same way as System.FilePath
  • dropTrailingPathSeparator behaves in the same way as System.FilePath
  • added various functions like isValid, normalise and equalFilePath
  • uses the word8 package for save word8 literals instead of OverloadedStrings
  • has custom versions of openFd and getDirectoryContents