git.iko.soy/typeable/stackage2nix
on be94366 help sign in
47 lines 1.3 kB history raw
1{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE TemplateHaskell #-}
4module Language.Nix.FilePath where
6import Control.DeepSeq
7import Control.Lens
8import Control.Monad
9import Data.Maybe
10import Data.String
11import Distribution.Compat.ReadP as ReadP
12import Distribution.Text
13import GHC.Generics (Generic)
14import Prelude hiding (FilePath)
15import qualified System.FilePath.Posix as Posix
16import Test.QuickCheck as QC
17import Text.PrettyPrint as PP
20newtype FilePath = FilePath { unFilePath :: String }
21 deriving (Show, Eq, Ord, Generic)
23makePrisms ''FilePath
25instance NFData FilePath where
26 rnf = rnf . unFilePath
28instance Arbitrary FilePath where
29 arbitrary = FilePath <$> QC.suchThat arbitrary Posix.isValid
30 shrink = fmap FilePath . shrink . unFilePath
32instance Text FilePath where
33 disp = text . renderFilePath
34 parse = parseFilePath
36instance IsString FilePath where
37 fromString s = fromMaybe (error $ "invalid Nix file path:" ++ s) (simpleParse s)
39parseFilePath :: ReadP r FilePath
40parseFilePath = do
41 path <- ReadP.munch (const True)
42 if Posix.isValid path
43 then pure (FilePath path)
44 else pfail
46renderFilePath :: FilePath -> String
47renderFilePath = Posix.combine "." . Posix.normalise . unFilePath