trait Arrow[A[_,_]] {
def arr[B,C](f: B => C): A[B,C]
def >>>[B,C,D](f: B => C, g: C => D): A[B,D]
def first[B,C,D](f: B => C): A[(B,D),(C,D)]
def second[B,C,D](f: B => C): A[(D,B),(D,C)]
def ***[B,C,D,E](f: B => C, g: D => E): A[(B,D),(C,E)]
def &&&[B,C,D](f: B => C, g: B => D): A[B,(C,D)]
}