add memoize
add thread_first/last to __init__