         return [:]
     }
     
-    public static func getIn(state: State, keyPath: [Any]) -> State? {
+    // Get the value along the given keypath or return None if the value
+    // does not exist
+    public static func getIn(state: State, keyPath: [Any]) -> State {
         if keyPath.count == 0 {
             return state
         }

            if let index = key as? Int {
                return getIn(array[index], keyPath: Array(dropFirst(keyPath)))
            } else {
                return nil
            }
        case let .Map(map, tag):
            if let name = key as? String {
                return getIn(map[name]!, keyPath: Array(dropFirst(keyPath))) ?? nil
            } else {
                return nil
            }
        default:
            return nil
        }
    }
    
    public static func setIn(state: State, forKeyPath: [Any], withValue: Any) -> State? {
            }
    
    
    // Recurse down to the key at the given path (creating the path if necessary), and

    func getIn(keyPath: [Any]) -> Immutable.State? {
        return Immutable.getIn(self, keyPath: keyPath)
    }
    
    func setIn(keyPath: [Any], withValue: Immutable.State?) -> Immutable.State {
        return Immutable.setIn(self, forKeyPath: keyPath, withValue: withValue)
    }
}

func ===(a: Immutable.State, b: Immutable.State) -> Bool {
