module Resource.Compressed.Zstd where import RIO import RIO.FilePath (takeExtension) import RIO.ByteString qualified as ByteString import Codec.Compression.Zstd qualified as Zstd data CompressedError = EmptyFile FilePath | ZstdError Text deriving (CompressedError -> CompressedError -> Bool (CompressedError -> CompressedError -> Bool) -> (CompressedError -> CompressedError -> Bool) -> Eq CompressedError forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: CompressedError -> CompressedError -> Bool $c/= :: CompressedError -> CompressedError -> Bool == :: CompressedError -> CompressedError -> Bool $c== :: CompressedError -> CompressedError -> Bool Eq, Int -> CompressedError -> ShowS [CompressedError] -> ShowS CompressedError -> String (Int -> CompressedError -> ShowS) -> (CompressedError -> String) -> ([CompressedError] -> ShowS) -> Show CompressedError forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [CompressedError] -> ShowS $cshowList :: [CompressedError] -> ShowS show :: CompressedError -> String $cshow :: CompressedError -> String showsPrec :: Int -> CompressedError -> ShowS $cshowsPrec :: Int -> CompressedError -> ShowS Show) instance Exception CompressedError fromFileWith :: MonadIO m => (ByteString -> m b) -> (FilePath -> m b) -> FilePath -> m b fromFileWith :: (ByteString -> m b) -> (String -> m b) -> String -> m b fromFileWith ByteString -> m b withBS String -> m b withFilePath String filePath | String -> [String] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool elem (ShowS takeExtension String filePath) [String] compressedExts = (ByteString -> m b) -> String -> m b forall (m :: * -> *) b. MonadIO m => (ByteString -> m b) -> String -> m b loadCompressed ByteString -> m b withBS String filePath | Bool otherwise = String -> m b withFilePath String filePath loadCompressed :: MonadIO m => (ByteString -> m b) -> FilePath -> m b loadCompressed :: (ByteString -> m b) -> String -> m b loadCompressed ByteString -> m b withBS String filePath = do ByteString yeet'd <- String -> m ByteString forall (m :: * -> *). MonadIO m => String -> m ByteString ByteString.readFile String filePath case ByteString -> Decompress Zstd.decompress ByteString yeet'd of Decompress Zstd.Skip -> CompressedError -> m b forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a throwIO (CompressedError -> m b) -> CompressedError -> m b forall a b. (a -> b) -> a -> b $ String -> CompressedError EmptyFile String filePath Zstd.Error String str -> CompressedError -> m b forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a throwIO (CompressedError -> m b) -> CompressedError -> m b forall a b. (a -> b) -> a -> b $ Text -> CompressedError ZstdError (String -> Text forall a. IsString a => String -> a fromString String str) Zstd.Decompress ByteString buf -> ByteString -> m b withBS ByteString buf compressedExts :: [FilePath] compressedExts :: [String] compressedExts = [ String ".zst" , String ".zstd" ]