runLogic :: (Functor m,Monad m) =>
  UTCTime ->
  (forall r. LogicOp r -> m r) ->
  Logic a ->
  m (Either String a)
runLogic now ops (Logic f)
  = retract
  $ hoistFree ops
  $ runErrorT
  $ runReaderT f now
runLogic :: (Functor m,Monad m) =>
  UTCTime ->
  (forall r. LogicOp r -> m r) ->
  Logic a ->
  m (Either String a)
runLogic now ops (Logic f)
  = retract
  $ hoistFree ops
  $ runErrorT
  $ runReaderT f now
runLogic now ops (Logic f)
  = retract
  $ hoistFree ops
  $ runErrorT
  $ runReaderT f now