2 Module : Gargantext.Prelude.Utils
3 Description : Useful Tools near Prelude of the project
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# LANGUAGE NoImplicitPrelude #-}
13 {-# LANGUAGE OverloadedStrings #-}
15 module Gargantext.Prelude.Utils
18 import Control.Lens (view)
19 import Control.Monad.Reader (MonadReader)
20 import Control.Monad.IO.Class (MonadIO, liftIO)
21 import Control.Monad.Random.Class (MonadRandom)
22 import Data.Text (Text)
23 import Control.Monad.Reader (ask)
24 import GHC.IO (FilePath)
25 import Gargantext.Prelude
26 import Gargantext.API.Settings
27 import System.Random (newStdGen)
28 import qualified System.Random.Shuffle as SRS
29 import System.Directory (createDirectoryIfMissing)
30 import qualified Data.ByteString.Lazy.Char8 as Char
31 import qualified Data.Digest.Pure.SHA as SHA (sha256, showDigest)
32 import qualified Data.Text as Text
35 shuffle :: MonadRandom m => [a] -> m [a]
36 shuffle ns = SRS.shuffleM ns
39 type FolderPath = FilePath
40 type FileName = FilePath
51 toPath :: Int -> Text -> (FolderPath,FileName)
52 toPath n x = (Text.unpack $ Text.intercalate "/" [x1,x2], Text.unpack xs)
54 (x1,x') = Text.splitAt n x
55 (x2,xs) = Text.splitAt n x'
57 class SaveFile a where
58 saveFile' :: FilePath -> a -> IO ()
60 class ReadFile a where
61 readFile' :: FilePath -> IO a
64 writeFile :: (MonadReader env m, MonadIO m, HasSettings env, SaveFile a)
67 dataPath <- view (settings . fileFolder) <$> ask
68 (fp,fn) <- liftIO $ (toPath 3) . hash . Text.pack . show <$> newStdGen
70 let foldPath = dataPath <> "/" <> fp
71 filePath = foldPath <> "/" <> fn
73 _ <- liftIO $ createDirectoryIfMissing True foldPath
74 _ <- liftIO $ saveFile' filePath a
79 readFile :: (MonadReader env m, MonadIO m, HasSettings env, ReadFile a)
82 dataPath <- view (settings . fileFolder) <$> ask
83 liftIO $ readFile' $ dataPath <> "/" <> fp