implement edge triggers