При взломе чего-то ранее, я создал следующий код:
newtype Callback a = Callback { unCallback :: a -> IO (Callback a) }
liftCallback :: (a -> IO ()) -> Callback a
liftCallback f = let cb = Callback $ \x -> (f x >> return cb) in cb
runCallback :: Callback a -> IO (a -> IO ())
runCallback cb =
do ref <- newIORef cb
return $ \x -> readIORef ref >>= ($ x) . unCallback >>= writeIORef ref
Callback a
представляет собой функцию, которая обрабатывает некоторые данные и возвращает новый обратный вызов, который должен использоваться для следующего уведомления. Обратный вызов, который может в основном заменить себя, так сказать. liftCallback
просто поднимает нормальную функцию к моему типу, а runCallback
использует IORef
для преобразования a Callback
в простую функцию.
Общая структура типа:
data T m a = T (a -> m (T m a))
Похоже, что это может быть изоморфно некоторой известной математической структуре теории категорий.
Но что это? Это монада или что-то еще? Аппликативный функтор? Трансформированная монада? Стрела, даже? Есть ли подобная поисковая система Hoogle, которая позволяет мне искать общие шаблоны, подобные этому?