{- |
   Module      :   Cookbook.Essential.IO
   Copyright   :   (c) 2014 by Nate Pisarski
   License     :   BSD3
   Maintainer  :   nathanpisarski@gmail.com
   Stability   :   Stable
   Portability :   Non-Portable (Cookbook, Strict, Environment)

Library for completing common IO tasks, integrating with files and UNIX functions.
-}

module Cookbook.Essential.IO where

import qualified System.IO                         as LIO
import qualified System.IO.Strict                  as SIO
import qualified Cookbook.Essential.Common         as Cm
import qualified Cookbook.Essential.Continuous     as Ct
 
import System.Directory

-- | Return the lines of a file as a list of Strings.
filelines :: String -> IO [String]
filelines x = fmap lines $ LIO.openFile x LIO.ReadMode >>= SIO.hGetContents

-- | Prompts the user for keyboard input
prompt :: String -> IO String
prompt x = do
    putStr x
    LIO.hFlush LIO.stdout
    getLine

-- | Returns the path of a file in the user's home directory. 
inhome :: String -> LIO.IOMode -> IO LIO.Handle
inhome x c = fmap ((++x).(++"/")) getHomeDirectory >>= flip LIO.openFile c

-- | Pure. Returns the file name with the directory truncated.
filename :: String -> String
filename = Cm.fromLast (`Ct.before` '/')

-- | Pure. Returns the module name. That is, path to the file with the file cut off.
modulename :: String -> String
modulename = Cm.fromLast (`Ct.after` '/')