content: 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
  