(;module: lux (lux (control ["F" functor] comonad) (type implicit))) (type: #export (Store s a) {#cursor s #peek (-> s a)}) (def: (extend f wa) (All [s a b] (-> (-> (Store s a) b) (Store s a) (Store s b))) {#cursor (get@ #cursor wa) #peek (function [s] (f (set@ #cursor s wa)))}) (struct: #export Functor (All [s] (F;Functor (Store s))) (def: (map f fa) (extend (function [store] (f (:: store peek (:: store cursor)))) fa))) (struct: #export CoMonad (All [s] (CoMonad (Store s))) (def: functor Functor) (def: (unwrap wa) (::: peek (::: cursor))) (def: split (extend id))) (def: #export (peeks trans store) (All [s a] (-> (-> s s) (Store s a) a)) (|> (::: cursor) trans (::: peek))) (def: #export (seek cursor store) (All [s a] (-> s (Store s a) (Store s a))) (:: (::: split store) peek cursor)) (def: #export (seeks change store) (All [s a] (-> (-> s s) (Store s a) (Store s a))) (|> store (::: split) (peeks change))) (def: #export (experiment Functor change store) (All [f s a] (-> (F;Functor f) (-> s (f s)) (Store s a) (f a))) (:: Functor map (::: peek) (change (::: cursor))))