Skip to content

Instantly share code, notes, and snippets.

@grantjbutler
Created November 23, 2016 01:32
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 grantjbutler/72ec9f95419f781073ce288e7f2a9f7a to your computer and use it in GitHub Desktop.
Save grantjbutler/72ec9f95419f781073ce288e7f2a9f7a to your computer and use it in GitHub Desktop.
LeekFish Postcard Sketch Picker Script
//: Playground - noun: a place where people can play
import UIKit
import GameplayKit
enum Tag: String {
case Cartoon
case Anime
case Game
case Movie
}
struct Character {
let name: String
let media: String
let tags: [Tag]
}
enum Filters {
static func tagIsCartoonAnimeOrGame(tag: Tag) -> Bool {
switch tag {
case .Cartoon, .Anime, .Game:
return true
case .Movie:
return false
}
}
}
extension Collection {
func every(test: (Self.Iterator.Element) -> Bool) -> Bool {
for element in self {
if !test(element) {
return false
}
}
return true
}
}
extension Array {
mutating func pick() -> Element {
let distribution = GKShuffledDistribution(randomSource: GKMersenneTwisterRandomSource(), lowestValue: 0, highestValue: count - 1)
return remove(at: distribution.nextInt())
}
}
struct Bag<Item> {
private let contents: [Item]
init(items: [Item]) {
contents = items
}
func choose(_ count: Int, where isIncluded: ((Item) -> Bool)? = nil) -> [Item] {
var mutatingContents = contents
if let isIncluded = isIncluded {
mutatingContents = mutatingContents.filter(isIncluded)
}
var results: [Item] = []
for _ in 0 ..< count {
results += [mutatingContents.pick()]
}
return results
}
}
extension Bag: ExpressibleByArrayLiteral {
init(arrayLiteral elements: Item...) {
self.init(items: elements)
}
}
var characters: Bag<Character> = [
Character(name: "Dipper Pines", media: "Gravity Falls", tags: [.Cartoon]),
Character(name: "Mabel Pines", media: "Gravity Falls", tags: [.Cartoon]),
Character(name: "Stan Pines", media: "Gravity Falls", tags: [.Cartoon]),
Character(name: "Ford Pines", media: "Gravity Falls", tags: [.Cartoon]),
Character(name: "Steven", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Garnet", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Amethyst", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Pearl", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Lapis", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Peridot", media: "Steven Universe", tags: [.Cartoon]),
Character(name: "Twilight Sparkle", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Applejack", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Fluttershy", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Rarity", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Pinkie Pie", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Rainbow Dash", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Octavia", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Vinyl Scratch", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Chrysalis", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Celestia", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Luna", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Cadence", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Derpy", media: "My Little Pony: Friendship is Magic", tags: [.Cartoon]),
Character(name: "Scooby Doo", media: "Scooby Doo", tags: [.Cartoon]),
Character(name: "Shaggy", media: "Scooby Doo", tags: [.Cartoon]),
Character(name: "Bender", media: "Futurama", tags: [.Cartoon]),
Character(name: "Fry", media: "Futurama", tags: [.Cartoon]),
Character(name: "Leela", media: "Futurama", tags: [.Cartoon]),
Character(name: "Scruffy. The Janitor.", media: "Futurama", tags: [.Cartoon]),
Character(name: "Aang", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Katara", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Sokka", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Toph", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Zuko", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Iroh", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Azula", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Ty Lee", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Mai", media: "Avatar: The Last Airbender", tags: [.Cartoon]),
Character(name: "Korra", media: "The Legend of Korra", tags: [.Cartoon]),
Character(name: "Bolin", media: "The Legend of Korra", tags: [.Cartoon]),
Character(name: "Mako", media: "The Legend of Korra", tags: [.Cartoon]),
Character(name: "Asami", media: "The Legend of Korra", tags: [.Cartoon]),
Character(name: "Blossom", media: "Powerpuff Girls", tags: [.Cartoon]),
Character(name: "Bubbles", media: "Powerpuff Girls", tags: [.Cartoon]),
Character(name: "Buttercup", media: "Powerpuff Girls", tags: [.Cartoon]),
Character(name: "Mojo Jojo", media: "Powerpuff Girls", tags: [.Cartoon]),
Character(name: "Bulbasaur", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Squirtle", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Blastoise", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Charmander", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Charizard", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Pikachu", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Litten", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Rowlet", media: "Pokemon", tags: [.Anime, .Game]),
Character(name: "Madoka Kaname", media: "Madoka", tags: [.Anime]),
Character(name: "Sayaka Miki", media: "Madoka", tags: [.Anime]),
Character(name: "Homura Akemi", media: "Madoka", tags: [.Anime]),
Character(name: "Kyoko Sakura", media: "Madoka", tags: [.Anime]),
Character(name: "Mami Tomoe", media: "Madoka", tags: [.Anime]),
Character(name: "Edward Elric", media: "Fullmetal Alchemist", tags: [.Anime]),
Character(name: "Alphonse Elric", media: "Fullmetal Alchemis", tags: [.Anime]),
Character(name: "Boba Fett", media: "Star Wars", tags: [.Movie]),
Character(name: "Rey", media: "Star Wars", tags: [.Movie]),
Character(name: "Kylo Ren", media: "Star Wars", tags: [.Movie]),
Character(name: "Finn", media: "Star Wars", tags: [.Movie]),
Character(name: "Poe Dameron", media: "Star Wars", tags: [.Movie])
]
characters.choose(3, where: { (item) in
return item.tags.every(test: Filters.tagIsCartoonAnimeOrGame)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment