 	public typealias PointedValue = ResultS
 	
 	public static func pure(a: ResultS) -> Self {
-		let values: StateS -> Identity<ValuesS> = {
-			let values = (a, $0) as! ValuesS
-			return Identity(values)
+		return Self.init {
+			Identity((a, $0) as! ValuesS)
 		}
-		
-		return Self.init(values)
 	}
 }
 


/// Fetch the current value of the state within the monad.
public func get<S>() -> State<S, S, (S, S)> {
	return State { Identity($0, $0) }
}

/// `put(state:)` sets the state within the monad to `s`
public func put<S>(state: S) -> State<S, (), ((), S)> {
	return State { _ in Identity((), state) }
}

/// Get a specific component of the state, using a projection function supplied.
public func gets<S, A>(f: S -> A) -> State<S, A, (A, S)> {
	return State { Identity(f($0), $0) }
}

/// `modify(f:)` is an action that updates the state to the result of applying `f`
/// to the current state.
public func modify<S>(f: S -> S) -> State<S, (), ((), S)> {
	return State { Identity((), f($0)) }
}

/// A variant of `modify(f:)` in which the computation is strict in the new state.

	
	/// `with(f:)` executes action on a state modified by applying `f`.
	public func with(f: StateS -> StateS) -> Self {
		return Self.init {
			self.run(f($0))
		}
	}
}

