{-|
  Types for Git objects and a parser of Git object files.
-}

module Data.Git (parseGitObject, module Data.Git.Types) where

import Codec.Zlib.Enum
import Data.Attoparsec.Enumerator
import Data.ByteString (ByteString)
import Data.Enumerator hiding (drop)
import qualified Data.Enumerator.Binary as EB
import Data.Git.Parser
import Data.Git.Types

{-|
  Parsing a Git file to 'GitObject'.
  This parser based on attoparsec-enumerator.
-}
parseGitObject :: FilePath -> IO GitObject
parseGitObject file = run_ $ EB.enumFile file
                          $$ decompress defaultWindowBits
                          =$ iterGitObject

iterGitObject :: Iteratee ByteString IO GitObject
iterGitObject = iterParser gitObject

infixr 0 =$
(=$) :: Monad m => Enumeratee ao ai m b -> Iteratee ai m b -> Iteratee ao m b
ee =$ ie = joinI $ ee $$ ie