Halogen Hooksの内部実装
Halogenの内部実装に影響はない
それからも分かる通り、HooksはComponentでやっていたような mkComponent
などのことを隠蔽している
Hook
UseHookF
で構成されている
built-in hooksを提供する
evalHook
関数によって、 Hook
から HalgenM
に変換される
HookM
HookF
で構成されている
evalHookM
によて、 HookM
から HalogenM
に変換される
dirHooks.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)
、によって、順序を保つ
これ結局今は使ってないっぽいな

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になっている

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している
参考