Task

Verify that a file called     input.txt     and   a directory called     docs     exist.



This should be done twice:  

   once for the current working directory,   and
   once for a file and a directory in the filesystem root.


Optional criteria (May 2015):   verify it works with:

   zero-length files
   an unusual filename:     `Abdu'l-Bahá.txt  


use framework "Foundation" -- YOSEMITE OS X onwards
use scripting additions
 
on run
    setCurrentDirectory("~/Desktop")
 
    ap({doesFileExist, doesDirectoryExist}, ¬
        {"input.txt", "/input.txt", "docs", "/docs"})
 
    --> {true, true, true, true, false, false, true, true}
 
    -- The first four booleans are returned by `doesFileExist`.
 
    -- The last four are returned by `doesDirectoryExist`,
    -- which yields false for simple files, and true for directories.
end run
 
-- GENERIC SYSTEM DIRECTORY FUNCTIONS -----------------------------------------
 
-- doesDirectoryExist :: String -> Bool
on doesDirectoryExist(strPath)
    set ca to current application
    set oPath to (ca's NSString's stringWithString:strPath)'s ¬
        stringByStandardizingPath
    set {bln, int} to (ca's NSFileManager's defaultManager()'s ¬
        fileExistsAtPath:oPath isDirectory:(reference))
    bln and (int = 1)
end doesDirectoryExist
 
-- doesFileExist :: String -> Bool
on doesFileExist(strPath)
    set ca to current application
    set oPath to (ca's NSString's stringWithString:strPath)'s ¬
        stringByStandardizingPath
    ca's NSFileManager's defaultManager()'s fileExistsAtPath:oPath
end doesFileExist
 
-- getCurrentDirectory :: String
on getCurrentDirectory()
    set ca to current application
    ca's NSFileManager's defaultManager()'s currentDirectoryPath as string
end getCurrentDirectory
 
-- getFinderDirectory :: String
on getFinderDirectory()
    tell application "Finder" to POSIX path of (insertion location as alias)
end getFinderDirectory
 
-- getHomeDirectory :: String
on getHomeDirectory()
    (current application's NSHomeDirectory() as string)
end getHomeDirectory
 
-- setCurrentDirectory :: String -> IO ()
on setCurrentDirectory(strPath)
    if doesDirectoryExist(strPath) then
        set ca to current application
        set oPath to (ca's NSString's stringWithString:strPath)'s ¬
            stringByStandardizingPath
        ca's NSFileManager's defaultManager()'s ¬
            changeCurrentDirectoryPath:oPath
    end if
end setCurrentDirectory
 
 
-- GENERIC HIGHER ORDER FUNCTIONS FOR THE TEST --------------------------------
 
-- A list of functions applied to a list of arguments
-- (<*> | ap) :: [(a -> b)] -> [a] -> [b]
on ap(fs, xs)
    set {intFs, intXs} to {length of fs, length of xs}
    set lst to {}
    repeat with i from 1 to intFs
        tell mReturn(item i of fs)
            repeat with j from 1 to intXs
                set end of lst to |λ|(contents of (item j of xs))
            end repeat
        end tell
    end repeat
    return lst
end ap
 
-- Lift 2nd class handler function into 1st class script wrapper 
-- mReturn :: Handler -> Script
on mReturn(f)
    if class of f is script then
        f
    else
        script
            property |λ| : f
        end script
    end if
end mReturn