0 | module Control.Monad.Resource
2 | import Control.Monad.MCancel
3 | import Control.Monad.MErr
8 | interface Resource (0 f : List Type -> Type -> Type) (0 a : Type) | a where
9 | cleanup : a -> f [] ()
14 | use1 : MCancel f => Resource f a => f es a -> (a -> f es b) -> f es b
15 | use1 alloc act = bracket alloc act cleanup
20 | {auto all : All (Resource f) ts}
21 | -> {auto can : MCancel f}
22 | -> (allocs : All (f es) ts)
23 | -> (act : HList ts -> f es b)
25 | use @{[]} [] act = act []
26 | use @{_::_} (h::t) act = use1 h (\r => use t (act . (r::)))