shithub: MicroHs

ref: 2367ff5c285d2343b48b8f9f3eea112c1eb657e6
dir: /lib/Control/Alternative.hs/

View raw version
module Control.Alternative(module Control.Alternative) where
import Primitives
import Control.Applicative
import Data.Bool_Type
import Data.Functor
import Data.List

infixl 3 <|>

class Applicative f => Alternative (f :: Type -> Type) where
    empty :: forall a . f a
    (<|>) :: forall a . f a -> f a -> f a

    some :: forall a . f a -> f [a]
    some a = (:) <$> a <*> many a

    many :: forall a . f a -> f [a]
    many a = some a <|> pure []

guard :: forall (f :: Type -> Type) a . Alternative f => Bool -> f ()
guard b = if b then pure () else empty