make this a trait:
```scala
sealed trait ValuePipe[+T] {
  def map[U](fn: T => U): ValuePipe[U]
  def toPipe: TypedPipe[T]
}
case class LiteralValue[T](value: T) extends ValuePipe[T] {
  def map[U](fn: T => U) = Literal(fn(value))
  lazy val toPipe = TypedPipe.from(IterableSource(Iterable(value)))
}
case class ComputedValue[T](override val toPipe[T]) extends ValuePipe[T] {
  def map[U](fn: T => U) = ComputedValue(toPipe.map(fn))
}
```
Also, do a case match in filterWithValue and mapWithValue to see if it is literal or Computed