fresh :: FDState s c -> (Int, FDState s c)
fresh = id &&& id
>>> first (^. nextId)
>>> ((i, s) -> (i, s & alive %~ Set.insert i))
>>> second (nextId %~ (+ 1))
fresh :: FDState s c -> (Int, FDState s c)
fresh s@FDState {_nextId = i, _alive = as} =
(i, s {_nextId = i + 1, _alive = Set.insert i as})