packages feed

cherry-core-alpha 0.4.0.0 → 0.5.0.0

raw patch · 2 files changed

+61/−10 lines, 2 files

Files

cherry-core-alpha.cabal view
@@ -1,6 +1,6 @@ cabal-version:       >=1.10 name:                cherry-core-alpha-version:             0.4.0.0+version:             0.5.0.0 synopsis:            The core library for Cherry Haskell. description:         The core library for Cherry Haskell, including a standard fuctions, server, and json parsing. license:             BSD3
src/File.hs view
@@ -13,15 +13,20 @@  -} -module File (Path, read, write, doesExist, list) where+module File (Path, read, rename, write, delete, doesExist, list) where  import qualified List import qualified String+import qualified Data.Maybe+import qualified System.IO.Error+import qualified Control.Exception import qualified Internal.Task as Task import qualified Internal.Utils as U import qualified "text-utf8" Data.Text.IO as IO import qualified System.Directory as Directory-import Prelude (return, getContents)+import qualified Prelude as P+import Prelude (return, getContents, sequence)+import Data.List (stripPrefix) import Basics import Maybe (Maybe (..)) import Result (Result (..))@@ -41,15 +46,39 @@  {-| -} write :: Path -> String -> Task x ()-write filename string =+write path string =   Task.Task <| do-    let dir = String.split "/" filename |> List.reverse |> List.drop 1 |> List.reverse |> String.join "/"+    let dir = String.split "/" path |> List.reverse |> List.drop 1 |> List.reverse |> String.join "/"     Directory.createDirectoryIfMissing True (String.toList dir)-    IO.writeFile (String.toList filename) (String.toTextUtf8 string)+    IO.writeFile (String.toList path) (String.toTextUtf8 string)     return (Ok ())   {-| -}+rename :: Path -> Path -> Task x ()+rename old new =+  Task.Task <|+    let handleError err =+          if System.IO.Error.isDoesNotExistError err+            then return ()+            else Control.Exception.throwIO err+    in+    P.fmap Ok (Directory.renameFile (String.toList old) (String.toList new) `Control.Exception.catch` handleError)+++{-| -}+delete :: Path -> Task x ()+delete path =+  Task.Task <|+    let handleError err =+          if System.IO.Error.isDoesNotExistError err+            then return ()+            else Control.Exception.throwIO err+    in+    P.fmap Ok (Directory.removeFile (String.toList path) `Control.Exception.catch` handleError)+++{-| -} doesExist :: Path -> Task x Bool doesExist path =   Task.Task <| do@@ -66,8 +95,30 @@   {-| -}-list :: Path -> Task x (List Path)+list :: Path -> Task String (List Path) list path =-  Task.Task <| do-    files <- Directory.listDirectory (String.toList path)-    return (Ok (List.map String.fromList files))+  Task.Task <|+    let+        findFiles :: P.String -> List P.String -> P.IO (List P.String)+        findFiles folder acc = do+          items <- Directory.listDirectory folder+          newfiles <- List.foldl checkOne (return []) (List.map (\i -> folder ++ "/" ++ i) items)+          return (acc ++ newfiles)++        checkOne :: P.String -> P.IO (List P.String) -> P.IO (List P.String)+        checkOne name acc = do+          exists <- Directory.doesDirectoryExist name+          if exists then do+            files <- acc+            findFiles name files+          else+            P.fmap (\fs -> name : fs) acc+    in do+    let directory = String.toList path+    exists <- Directory.doesDirectoryExist directory+    if exists then do+      files <- findFiles directory []+      let final = Data.Maybe.mapMaybe (stripPrefix (directory ++ "/")) files+      return (Ok (List.map String.fromList final))+    else+      return (Err "Given path is not a directory.")