/*
 * Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com>
 */
package play.api.libs.functional

import scala.language.higherKinds

trait Alternative[M[_]] {

  def app: Applicative[M]
  def |[A, B >: A](alt1: M[A], alt2: M[B]): M[B]
  def empty: M[Nothing]
  //def some[A](m: M[A]): M[List[A]]
  //def many[A](m: M[A]): M[List[A]]

}

class AlternativeOps[M[_], A](alt1: M[A])(implicit a: Alternative[M]) {

  def |[B >: A](alt2: M[B]): M[B] = a.|(alt1, alt2)
  def or[B >: A](alt2: M[B]): M[B] = |(alt2)

}