{-# LANGUAGE DeriveFunctor #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Yi.Keymap.Vim.MatchResult
-- License     :  GPL-2
-- Maintainer  :  yi-devel@googlegroups.com
-- Stability   :  experimental
-- Portability :  portable

module Yi.Keymap.Vim.MatchResult where

import           Control.Applicative (Alternative ((<|>), empty))

data MatchResult a = NoMatch
                   | PartialMatch
                   | WholeMatch a
                   deriving a -> MatchResult b -> MatchResult a
(a -> b) -> MatchResult a -> MatchResult b
(forall a b. (a -> b) -> MatchResult a -> MatchResult b)
-> (forall a b. a -> MatchResult b -> MatchResult a)
-> Functor MatchResult
forall a b. a -> MatchResult b -> MatchResult a
forall a b. (a -> b) -> MatchResult a -> MatchResult b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> MatchResult b -> MatchResult a
$c<$ :: forall a b. a -> MatchResult b -> MatchResult a
fmap :: (a -> b) -> MatchResult a -> MatchResult b
$cfmap :: forall a b. (a -> b) -> MatchResult a -> MatchResult b
Functor

instance Applicative MatchResult where
    pure :: a -> MatchResult a
pure = a -> MatchResult a
forall a. a -> MatchResult a
WholeMatch
    WholeMatch f :: a -> b
f <*> :: MatchResult (a -> b) -> MatchResult a -> MatchResult b
<*> WholeMatch x :: a
x = b -> MatchResult b
forall a. a -> MatchResult a
WholeMatch (a -> b
f a
x)
    _ <*> _ = MatchResult b
forall a. MatchResult a
NoMatch

instance Alternative MatchResult where
    empty :: MatchResult a
empty = MatchResult a
forall a. MatchResult a
NoMatch
    WholeMatch x :: a
x <|> :: MatchResult a -> MatchResult a -> MatchResult a
<|> _ = a -> MatchResult a
forall a. a -> MatchResult a
WholeMatch a
x
    _ <|> WholeMatch x :: a
x = a -> MatchResult a
forall a. a -> MatchResult a
WholeMatch a
x
    PartialMatch <|> _ = MatchResult a
forall a. MatchResult a
PartialMatch
    _ <|> PartialMatch = MatchResult a
forall a. MatchResult a
PartialMatch
    _ <|> _ = MatchResult a
forall a. MatchResult a
NoMatch

instance Show (MatchResult a) where
    show :: MatchResult a -> String
show (WholeMatch _) = "WholeMatch"
    show PartialMatch = "PartialMatch"
    show NoMatch = "NoMatch"

matchFromBool :: Bool -> MatchResult ()
matchFromBool :: Bool -> MatchResult ()
matchFromBool b :: Bool
b = if Bool
b then () -> MatchResult ()
forall a. a -> MatchResult a
WholeMatch () else MatchResult ()
forall a. MatchResult a
NoMatch

matchFromMaybe :: Maybe a -> MatchResult a
matchFromMaybe :: Maybe a -> MatchResult a
matchFromMaybe Nothing = MatchResult a
forall a. MatchResult a
NoMatch
matchFromMaybe (Just a :: a
a) = a -> MatchResult a
forall a. a -> MatchResult a
WholeMatch a
a