git.iko.soy/typeable/cabal2nix
on master help sign in
Improve memory usage of PackageMap reading
badda1eBenno Fünfstück
src/Distribution/Nixpkgs/PackageMap.hs+6−3
@@ -1,12 +1,12 @@
1module Distribution.Nixpkgs.PackageMap where
1module Distribution.Nixpkgs.PackageMap where
2
2
3import qualified Data.Aeson as JSON
3import qualified Data.Aeson as JSON
4+import qualified Data.ByteString.Lazy as LBS
4import Data.List.Split
5import Data.List.Split
5import qualified Data.Map as Map
6import qualified Data.Map as Map
6import Data.Map.Strict ( Map )
7import Data.Map.Strict ( Map )
7import Data.Set ( Set )
8import Data.Set ( Set )
8import qualified Data.Set as Set
9import qualified Data.Set as Set
9−import qualified Data.String.UTF8 as UTF8 ( fromString, toRep )
10import System.Process
10import System.Process
11
11
12type Attribute = String
12type Attribute = String
@@ -14,9 +14,12 @@ type Path = [Attribute]
14
14
15readNixpkgAttributeSet :: FilePath -> IO (Set Attribute)
15readNixpkgAttributeSet :: FilePath -> IO (Set Attribute)
16readNixpkgAttributeSet nixpkgs = do
16readNixpkgAttributeSet nixpkgs = do
17− buf <- readProcess "nix-env" ["-qaP", "--json", "-f"++nixpkgs] ""
17+ (_, Just h, _, _) <- createProcess (proc "nix-env" ["-qaP", "--json", "-f"++nixpkgs])
18+ { std_out = CreatePipe
19+ }
20+ buf <- LBS.hGetContents h
18 let pkgmap :: Either String (Map Attribute JSON.Object)
21 let pkgmap :: Either String (Map Attribute JSON.Object)
19− pkgmap = JSON.eitherDecodeStrict (UTF8.toRep (UTF8.fromString buf))
22+ pkgmap = JSON.eitherDecode buf
20 either fail (return . Map.keysSet) pkgmap
23 either fail (return . Map.keysSet) pkgmap
21
24
22parsePackage :: Attribute -> (Attribute, Path)
25parsePackage :: Attribute -> (Attribute, Path)