Skip to content

Instantly share code, notes, and snippets.

@volkanunsal
Last active August 29, 2015 14:02
Show Gist options
  • Save volkanunsal/c13441adf8b8706de056 to your computer and use it in GitHub Desktop.
Save volkanunsal/c13441adf8b8706de056 to your computer and use it in GitHub Desktop.
ANY = "ANY"
# Public: Logic engine
#
# args: the criteria to match against
#
# Examples
#
# args = {noncitizen: true, in_prison: false, term_served: true, paroled: true, on_probation: false, fines_paid: true, num_years_since_release: 5, felony_type: "robbery"}
# Engine.check(args)
# # => ["alabama"]
#
# Returns the states that fit the criteria
class Engine
# state, noncitizen, in_prison, term_served, paroled, on_probation, fines_paid, num_years_since_release
@voter_profiles: [
["alabama", false, false, true, true, false, ANY, ANY],
["alaska", false, false, true, true, false, ANY, ANY],
["arizona", false, false, true, ANY, ANY, ANY, ANY],
["arkansas", false, false, true, true, false, ANY, ANY],
["california", false, false, true, true, ANY, ANY, ANY],
["colorado", false, false, true, true, ANY, ANY, ANY],
["connecticut", false, false, true, true, ANY, ANY, ANY],
["delaware", false, false, true, true, false, ANY, ANY],
["district_of_columbia", false, false, true, ANY, ANY, ANY, ANY],
["florida", false, false, true, true, false, ANY, ANY],
["georgia", false, false, true, true, false, ANY, ANY],
["hawaii", false, false, true, ANY, ANY, ANY, ANY],
["idaho", false, false, true, true, false, ANY, ANY],
["illinois", false, false, true, ANY, ANY, ANY, ANY],
["indiana", false, false, true, ANY, ANY, ANY, ANY],
["iowa", false, false, true, true, false, true, ANY],
["kansas", false, false, true, true, false, ANY, ANY],
["kentucky", false, false, true, true, false, ANY, ANY],
["louisiana", false, false, true, true, false, ANY, ANY],
["maine", false, ANY, ANY, ANY, ANY, ANY, ANY],
["maryland", false, false, true, true, false, ANY, ANY],
["massachusetts", false, false, true, ANY, ANY, ANY, ANY],
["michigan", false, false, true, ANY, ANY, ANY, ANY],
["minnesota", false, false, true, true, false, ANY, ANY],
["mississippi", false, false, true, true, false, ANY, ANY],
["missouri", false, false, true, true, false, ANY, ANY],
["montana", false, false, true, ANY, ANY, ANY, ANY],
["nebraska", false, false, true, true, false, ANY, 2],
["nevada", false, false, true, ANY, ANY, ANY, ANY],
["new_hampshire", false, false, true, ANY, ANY, ANY, ANY],
["new_jersey", false, false, true, true, false, ANY, ANY],
["new_mexico", false, false, true, true, false, ANY, ANY],
["new_york", false, false, true, true, ANY, ANY, ANY],
["north_carolina", false, false, true, true, false, ANY, ANY],
["north_dakota", false, false, true, ANY, ANY, ANY, ANY],
["ohio", false, false, true, ANY, ANY, ANY, ANY],
["oklahoma", false, false, true, true, false, ANY, ANY],
["oregon", false, false, true, ANY, ANY, ANY, ANY],
["pennsylvania", false, false, true, ANY, ANY, ANY, ANY],
["rhode_island", false, false, true, ANY, ANY, ANY, ANY],
["south_carolina", false, false, true, true, false, ANY, ANY],
["south_dakota", false, false, true, true, false, ANY, ANY],
["tennessee", false, false, true, true, false, ANY, 2],
["texas", false, false, true, true, false, ANY, ANY],
["utah", false, false, true, ANY, ANY, ANY, ANY],
["vermont", false, ANY, ANY, ANY, ANY, ANY, ANY],
["virginia", false, false, true, true, false, ANY, ANY],
["washington", false, false, true, true, false, ANY, ANY],
["west_virginia", false, false, true, true, false, ANY, ANY],
["wisconsin", false, false, true, true, false, ANY, ANY],
["wyoming", false, false, true, true, false, ANY, 5]
]
@egregious_felonies:
"alabama": ["murder", "rape", "incest", "sexual_crime_against_children"]
"delaware": ["murder", "bribery", "manslaughter", "abuse_of_office"]
"florida": ["everything"]
"kentucky": ["everything"]
"mississippi": ["everything"]
"nebraska": ["treason"]
"tennessee": ["murder", "rape", "treason", "voter_fraud"]
"virginia": ["murder", "rape"]
"wyoming": ["murder", "rape"]
@check: (opts)->
a = _.defaults(opts, {noncitizen: false, in_prison: false, term_served: true, paroled: ANY, on_probation: false, fines_paid: ANY, num_years_since_release: ANY, "felony_type[]": ANY})
arglist = [a["noncitizen"], a["in_prison"], a["term_served"], a["paroled"], a["on_probation"], a["fines_paid"], a["num_years_since_release"]]
@find(a["felony_type[]"],arglist)
@find: (felony_type,arglist)->
states = []
felonies = @egregious_felonies
_.each(@voter_profiles, (profile)->
[state, rules] = [_.first(profile), _.rest(profile)]
# Comparing the rule to the corresponding value in the arglist. If the rule and arglist value match, continue as normal. If either of the rules are ANY, then continue as normal. Next, make sure that the felony, if it exists, is not in egregious felonies list.
release_rule_index = rules.length - 1
validator = (rule,i)->
return true if arglist[i] == ANY or rule == ANY
if i is release_rule_index
# the num_years_since_release require a gtd check
arglist[i] >= rule or isNaN(parseInt(arglist[i]))
else
arglist[i] == rule
bad_felony_done = (felonies[state] and _.some(felony_type, ((f)->_.contains(felonies[state],f)))) || false
# When the iteration is complete, if no rules have been violated, then add the state into the states array.
states.push(state) if(_.every(rules, validator) and !bad_felony_done)
)
states
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment