From 42920810c93c909029ccab5a96686d20c3253d91 Mon Sep 17 00:00:00 2001 From: Christoffer Tews Date: Tue, 10 May 2016 14:00:46 +0200 Subject: [PATCH] Save split group membership --- CTSplitTest/CTSplitTest.swift | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/CTSplitTest/CTSplitTest.swift b/CTSplitTest/CTSplitTest.swift index 574f7ef..1b5bc51 100644 --- a/CTSplitTest/CTSplitTest.swift +++ b/CTSplitTest/CTSplitTest.swift @@ -10,30 +10,80 @@ import Foundation struct CTSplitTest { + // Typealias typealias SplitGroup = () -> Void - func runABTest(distribution:[Double]=[0.5,0.5], groupA:ReferralGroup?, groupB:ReferralGroup?) { - let rnd = self._randomNumber(probabilities: distribution) + // Constants + let kSplitGroupKey = "splitGroup" + let kGroupA = "groupA" + let kGroupB = "groupB" + let kGroupC = "groupC" + + func runABTest(distribution:[Double]=[0.5,0.5], groupA:SplitGroup?, groupB:SplitGroup?) { + let membership = _getGroupMembership() + guard membership == nil else { + if membership == kGroupA { + groupA?() + } else { + groupB?() + } + + return + } + + let rnd = self._randomNumber(probabilities: distribution) if rnd == 0 { + _saveGroupMembership(kGroupA) groupA?() } else { + _saveGroupMembership(kGroupB) groupB?() } } func runABCTest(groupA groupA:SplitGroup?, groupB:SplitGroup?, groupC:SplitGroup?) { + let membership = _getGroupMembership() + guard membership == nil else { + if membership == kGroupA { + groupA?() + } else if membership == kGroupB { + groupB?() + } else { + groupC?() + } + + return + } + let rnd = self._randomNumber(probabilities: [0.33, 0.33, 0,33]) if rnd == 0 { + _saveGroupMembership(kGroupA) groupA?() } else if rnd == 1 { + _saveGroupMembership(kGroupB) groupB?() } else { + _saveGroupMembership(kGroupC) groupC?() } } + private func _getGroupMembership() -> String? { + let defaults = NSUserDefaults.standardUserDefaults() + let membership = defaults.objectForKey(kSplitGroupKey) as? String + + return membership + } + + private func _saveGroupMembership(group:String) { + let defaults = NSUserDefaults.standardUserDefaults() + defaults.setObject(group, forKey: kSplitGroupKey) + defaults.synchronize() + } + + /** * Create a random number with distribution * E.g. randomNumber([0.5,0.5]) generate a 0 or 1 with 50-50 split