diff --git a/SwiftShell/Command.swift b/SwiftShell/Command.swift index fc3d1a9..d91f15e 100644 --- a/SwiftShell/Command.swift +++ b/SwiftShell/Command.swift @@ -85,5 +85,5 @@ public func $ (shellcommand: String) -> String { /** Turn a sequence into valid parameters for a shell command, properly quoted */ public func parameters (sequence: S) -> String { - return " " + " ".join( sequence.map { "\"\($0)\"" } ) + return " " + ( sequence.map { "\"\($0)\"" } ).joinWithSeparator(" ") } diff --git a/SwiftShell/FileHandle.swift b/SwiftShell/FileHandle.swift index 7ad3eab..fe5f757 100644 --- a/SwiftShell/FileHandle.swift +++ b/SwiftShell/FileHandle.swift @@ -71,16 +71,25 @@ extension FileHandle: WriteableStreamType { exit(EXIT_FAILURE) } +/** Run a function which takes a NSErrorPointer. If an NSError occurs, throw it, otherwise return result. */ +func makeThrowable (nserrorfunc: (NSErrorPointer) -> T) throws -> T { + var maybeerror: NSError? + let result = nserrorfunc(&maybeerror) + if let actualerror = maybeerror { + throw actualerror + } + return result +} + /** Open a file for reading, and exit if an error occurs. */ public func open (path: String) -> ReadableStreamType { let url = toURLOrError(path) do { - let filehandle = try FileHandle(forReadingFromURL: url) - return filehandle + return try FileHandle(forReadingFromURL: url) } catch { do { - try url.checkResourceIsReachable() + try makeThrowable(url.checkResourceIsReachableAndReturnError) } catch { printErrorAndExit(error) } @@ -107,7 +116,7 @@ public func open (forWriting path: String, overwrite: Bool = false) -> Writeable return filehandle } catch { do { - try url.checkResourceIsReachable() + try makeThrowable(url.checkResourceIsReachableAndReturnError) } catch { printErrorAndExit(error) } diff --git a/SwiftShell/Pipes.swift b/SwiftShell/Pipes.swift index 659dc07..6920377 100644 --- a/SwiftShell/Pipes.swift +++ b/SwiftShell/Pipes.swift @@ -22,9 +22,9 @@ public func |> (lhs: T, rhs: T -> U) -> U { public func filter (includeElement: (S.Generator.Element) -> Bool) (source: S) - -> LazySequence> { + -> LazyFilterSequence { - return lazy(source).filter(includeElement) + return source.lazy.filter(includeElement) } /** @@ -45,9 +45,9 @@ public func sorted public func map (transform: (S.Generator.Element) -> T) (source: S) - -> LazySequence> { + -> LazyMapSequence { - return lazy(source).map(transform) + return source.lazy.map(transform) } /** @@ -71,9 +71,9 @@ public func split (delimiter delimiter: String = "\n")(text: String) -> [String] public func join (separator: C) (elements: S) - -> C { + -> JoinSequence { - return join(separator, elements) + return elements.joinWithSeparator(separator) } /** Turn a sequence into an array. For use after the |> operator. */ @@ -85,7 +85,7 @@ public func toArray (sequence: S) -> [S.Generator.Element] { public func drop (tobedropped: [T]) (sequence: S) - -> LazySequence> { + -> LazyFilterSequence { return sequence |> filter { !tobedropped.contains($0) } } diff --git a/SwiftShellTests/Scripts/runtests.bash b/SwiftShellTests/Scripts/runtests.bash index 70cbcf9..3ae3dca 100755 --- a/SwiftShellTests/Scripts/runtests.bash +++ b/SwiftShellTests/Scripts/runtests.bash @@ -19,7 +19,7 @@ export DYLD_FRAMEWORK_PATH=$PROJECT_ROOT/build/Release/ # Be aware the “assert” command does not check standard error output or exit code. -assert "./print_arguments.swift 1 2" "[./print_arguments.swift, 1, 2]" +assert "./print_arguments.swift 1 2" "[\"./print_arguments.swift\", \"1\", \"2\"]" assert_raises "./exitswhenopeningnon-existentfile.swift" 1 assert "cat onetwothree.txt | ./print_linenumbers.swift" "line 1: one\nline 2: two\nline 3: three" assert "./stream_out.swift" " 3"