2013/Libraries/Fusion/Types.luau

160 lines
4.2 KiB
Plaintext

--!strict
--[[
Stores common type information used internally.
These types may be used internally so Fusion code can type-check, but
should never be exposed to public users, as these definitions are fair game
for breaking changes.
]]
local PubTypes = require "./PubTypes"
type Set<T> = { [T]: any }
--[[
General use types
]]
-- A symbol that represents the absence of a value.
export type None = PubTypes.Symbol & {
-- name: "None" (add this when Luau supports singleton types)
}
-- Stores useful information about Luau errors.
export type Error = {
type: string, -- replace with "Error" when Luau supports singleton types
raw: string,
message: string,
trace: string,
}
-- An object which stores a value scoped in time.
export type Contextual<T> = PubTypes.Contextual<T> & {
_valuesNow: { [thread]: { value: T } },
_defaultValue: T,
}
--[[
Generic reactive graph types
]]
export type StateObject<T> = PubTypes.StateObject<T> & {
_peek: (StateObject<T>) -> T,
}
--[[
Specific reactive graph types
]]
-- A state object whose value can be set at any time by the user.
export type State<T> = PubTypes.Value<T> & {
_value: T,
}
-- A state object whose value is derived from other objects using a callback.
export type Computed<T> = PubTypes.Computed<T> & {
_oldDependencySet: Set<PubTypes.Dependency>,
_callback: (PubTypes.Use) -> T,
_value: T,
}
-- A state object whose value is derived from other objects using a callback.
export type ForPairs<KI, VI, KO, VO, M> = PubTypes.ForPairs<KO, VO> & {
_oldDependencySet: Set<PubTypes.Dependency>,
_processor: (PubTypes.Use, KI, VI) -> (KO, VO),
_destructor: (VO, M?) -> (),
_inputIsState: boolean,
_inputTable: PubTypes.CanBeState<{ [KI]: VI }>,
_oldInputTable: { [KI]: VI },
_outputTable: { [KO]: VO },
_oldOutputTable: { [KO]: VO },
_keyIOMap: { [KI]: KO },
_meta: { [KO]: M? },
_keyData: {
[KI]: {
dependencySet: Set<PubTypes.Dependency>,
oldDependencySet: Set<PubTypes.Dependency>,
dependencyValues: { [PubTypes.Dependency]: any },
},
},
}
-- A state object whose value is derived from other objects using a callback.
export type ForKeys<KI, KO, M> = PubTypes.ForKeys<KO, any> & {
_oldDependencySet: Set<PubTypes.Dependency>,
_processor: (PubTypes.Use, KI) -> KO,
_destructor: (KO, M?) -> (),
_inputIsState: boolean,
_inputTable: PubTypes.CanBeState<{ [KI]: KO }>,
_oldInputTable: { [KI]: KO },
_outputTable: { [KO]: any },
_keyOIMap: { [KO]: KI },
_meta: { [KO]: M? },
_keyData: {
[KI]: {
dependencySet: Set<PubTypes.Dependency>,
oldDependencySet: Set<PubTypes.Dependency>,
dependencyValues: { [PubTypes.Dependency]: any },
},
},
}
-- A state object whose value is derived from other objects using a callback.
export type ForValues<VI, VO, M> = PubTypes.ForValues<any, VO> & {
_oldDependencySet: Set<PubTypes.Dependency>,
_processor: (PubTypes.Use, VI) -> VO,
_destructor: (VO, M?) -> (),
_inputIsState: boolean,
_inputTable: PubTypes.CanBeState<{ [VI]: VO }>,
_outputTable: { [any]: VI },
_valueCache: { [VO]: any },
_oldValueCache: { [VO]: any },
_meta: { [VO]: M? },
_valueData: {
[VI]: {
dependencySet: Set<PubTypes.Dependency>,
oldDependencySet: Set<PubTypes.Dependency>,
dependencyValues: { [PubTypes.Dependency]: any },
},
},
}
-- A state object which follows another state object using tweens.
export type Tween<T> = PubTypes.Tween<T> & {
_goalState: State<T>,
_tweenInfo: TweenInfo,
_prevValue: T,
_nextValue: T,
_currentValue: T,
_currentTweenInfo: TweenInfo,
_currentTweenDuration: number,
_currentTweenStartTime: number,
_currentlyAnimating: boolean,
}
-- A state object which follows another state object using spring simulation.
export type Spring<T> = PubTypes.Spring<T> & {
_speed: PubTypes.CanBeState<number>,
_speedIsState: boolean,
_lastSpeed: number,
_damping: PubTypes.CanBeState<number>,
_dampingIsState: boolean,
_lastDamping: number,
_goalState: State<T>,
_goalValue: T,
_currentType: string,
_currentValue: T,
_springPositions: { number },
_springGoals: { number },
_springVelocities: { number },
}
-- An object which can listen for updates on another state object.
export type Observer = PubTypes.Observer & {
_changeListeners: Set<() -> ()>,
_numChangeListeners: number,
}
return nil