Skip to content

Instantly share code, notes, and snippets.

@lukesutton
Created December 12, 2016 05:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lukesutton/94a003d1dd3f1d33ad805241fffbbe3d to your computer and use it in GitHub Desktop.
Save lukesutton/94a003d1dd3f1d33ad805241fffbbe3d to your computer and use it in GitHub Desktop.
struct File {}
struct Landscape {
let parents: FileList
let children: FileList
}
struct FileList {
fileprivate let all: Array<File>
fileprivate let before: ArraySlice<File>
fileprivate let after: ArraySlice<File>
var previous: FileList {
guard !before.isEmpty else { return self }
return shift(by: before.count - 1)
}
var next: FileList {
guard !after.isEmpty else { return self }
return shift(by: before.count + 1)
}
var current: File? {
return before.last
}
var isEmpty: Bool {
return all.isEmpty
}
fileprivate func shift(by prefixLength: Int) -> FileList {
return FileList(
all: all,
before: all.prefix(prefixLength),
after: all.suffix(all.count - prefixLength)
)
}
}
extension FileList {
fileprivate init(_ elements: File...) {
self.all = elements
self.before = elements.prefix(1)
self.after = elements.suffix(elements.count - 1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment