generated at
Halogen Hooksの内部実装
Halogen Hooksは、通常のHalogen Componentの上に実装されたものである
Halogenの内部実装に影響はない
それからも分かる通り、HooksはComponentでやっていたような mkComponent などのことを隠蔽している


2つのFreeモナドとして実装されている
両方とも最終的にはH.HalogenM型に変換されるmrsekut
Hook
UseHookF で構成されている
built-in hooksを提供する
evalHook 関数によって、 Hook から HalgenM に変換される
HookM
HookF で構成されている
H.HalogenM型で使用していたものと同じ機能を全て提供する
evalHookM によて、 HookM から HalogenM に変換される



dir
Hooks.purs -- built-in hooks の定義 Hooks Hook.purs -- Hook自由モナド の定義 HookM.purs -- HookF型と、 HookM自由モナド の定義 Types.purs Component.purs Internal Types.js Eval.purs -- evalHook や evalHookM の定義 Types.purs UseHookF.purs -- UseHookF型 の定義 Eval Types.purs




Hook
Hook.purs(hs)
newtype Hook :: (Type -> Type) -> HookType -> Type -> Type newtype Hook m h a = Hook (Free (UseHookF m) a) type role Hook representational nominal representational derive instance Functor (Hook m h)
、によって、順序を保つ
これ結局今は使ってないっぽいなmrsekut

UseHookF
UseHookF.purs(hs)
data UseHookF m a = UseState StateValue ((StateValue /\ StateId StateValue) -> a) | UseEffect (Maybe MemoValues) (HookM m (Maybe (HookM m Unit))) a | UseQuery (QueryToken QueryValue) (forall b. QueryValue b -> HookM m (Maybe b)) a | UseMemo MemoValues (Unit -> MemoValue) (MemoValue -> a) | UseRef RefValue ((RefValue /\ Ref RefValue) -> a) derive instance :: Functor (UseHookF m)
Hook Free Monadを構成するので、この UseHookF はFunctorになっているmrsekut


HookM
HookF で、HalogenM内でできる操作をDSLとして定義している
HookM.purs(hs)
data HookF m a = Modify (StateId StateValue) (StateValue -> StateValue) (StateValue -> a) | Subscribe (H.SubscriptionId -> HS.Emitter (HookM m Unit)) (H.SubscriptionId -> a) | Unsubscribe H.SubscriptionId a | Lift (m a) | ChildQuery (CQ.ChildQueryBox SlotType a) | Raise OutputValue a | Par (HookAp m a) | Fork (HookM m Unit) (H.ForkId -> a) | Kill H.ForkId a | GetRef H.RefLabel (Maybe DOM.Element -> a) derive instance :: Functor m => Functor (HookF m) newtype HookM m a = HookM (Free (HookF m) a) -- この後、monadまでderivingしている



参考