whole_func_string: function makeStateValidator(type){
  	if(type.type === 'set' || type.type === 'list'){
  		return function(s){
  			_.assertArray(s)
  			return s
  		}
  	}else if(type.type === 'map'){
  		return function(m){
  			if(m === undefined) return {}
  			_.assertObject(m)
  			return m
  		}
  	}else if(type.type === 'primitive'){
  		return function(v){
  			_.assertPrimitive(v)
  			return v
  		}
  	}else if(type.type === 'object'){
  		return function(id){
  			_.assertNot(_.isArray(id))
  			return id
  		}
  	}else if(type.type === 'view'){
  		return function(id){
  			_.assertNot(_.isArray(id))
  			if(id !== undefined) _.assertString(id)
  			return id
  		}
  	}else if(type.type === 'nil'){
  		return function(n){
  			return n
  		}
  	}else{
  		_.errout('TODO: ' + JSON.stringify(type))
  	}
  }
func_code_string: function makeStateValidator(type){
  	if(type.type === 'set' || type.type === 'list'){
  		return function(s){
  			_.assertArray(s)
  			return s
  		}
  	}else if(type.type === 'map'){
  		return function(m){
  			if(m === undefined) return {}
  			_.assertObject(m)
  			return m
  		}
  	}else if(type.type === 'primitive'){
  		return function(v){
  			_.assertPrimitive(v)
  			return v
  		}
  	}else if(type.type === 'object'){
  		return function(id){
  			_.assertNot(_.isArray(id))
  			return id
  		}
  	}else if(type.type === 'view'){
  		return function(id){
  			_.assertNot(_.isArray(id))
  			if(id !== undefined) _.assertString(id)
  			return id
  		}
  	}else if(type.type === 'nil'){
  		return function(n){
  			return n
  		}
  	}else{
  		_.errout('TODO: ' + JSON.stringify(type))
  	}
  }
func_documentation_string: /*
  function makeChangeConverter(type){
  _.errout('TODO REMOVE')
  if(type.type === 'set' || type.type === 'list'){
  return function(state){
  var changes = []
  _.assertDefined(state)
  _.assertArray(state)
  
  state.forEach(function(v){
  changes.push({type: 'add', value: v})
  })
  return changes
  }
  }else if(type.type === 'map'){
  return function(edits){
  _.errout('TODO')
  }
  }else if(type.type === 'primitive' || type.type === 'object' || type.type === 'view'){
  return function(state){
  if(_.isArray(state)) _.errout('bad convert')
  if(state !== undefined){
  return [{type: 'set', value: state}]
  }else{
  return []
  }
  }
  }else if(type.type === 'nil'){
  return function(state){
  _.errout('TODO?')
  }
  }
  
  _.errout('tODO: ' + JSON.stringify(type))
  }