packages feed

foscam-directory-0.0.4: src/Data/Foscam/Directory.hs

{-# LANGUAGE NoImplicitPrelude #-}

module Data.Foscam.Directory(
  getFoscamDirectoryContents
, FoscamDirectoryFile(Isn't, Is)
, filenames
) where

import Control.Category((.), id)
import Data.ByteString.UTF8 as UTF8(fromString)
import Data.Eq(Eq)
import Data.Foscam.File.Filename(Filename, filename)
import Data.Functor(fmap, (<$>))
import Data.List(foldr)
import Data.Ord(Ord)
import System.Directory(getDirectoryContents)
import System.IO(IO, FilePath)
import Text.Trifecta(Result(Success, Failure), parseString)
import Text.Trifecta.Delta(Delta(Directed))
import Prelude(Show)

data FoscamDirectoryFile =
  Isn't FilePath
  | Is Filename
  deriving (Eq, Ord, Show)

getFoscamDirectoryContents ::
  FilePath
  -> IO [FoscamDirectoryFile]
getFoscamDirectoryContents p =
  let fromResult (Success n) =
        Is n
      fromResult (Failure _) =
        Isn't p
  in fmap (fromResult . parseString filename (Directed (UTF8.fromString p) 0 0 0 0)) <$> getDirectoryContents p

filenames ::
  [FoscamDirectoryFile]
  -> [Filename]
filenames =
  foldr (\f -> case f of
                 Isn't _ -> id
                 Is n -> (n:)) []