-- $usage:interface
-- We call a record type whose fields are methods as an interface.
--
-- In the following example, @UserRepo@ is an interface.
--
-- Dependency to an interface @F@ is represented as type constraint @Has1 F env@,
-- methods of the interface can be invoked inside @'runIF'@.
--
-- @
-- data UserRepo env = UserRepo {
--   _createUser :: UserName -> RIO env UserId,
--   _setPassword :: UserId -> Password -> RIO env ()
-- }
-- makeLenses ''UserRepo