{-# LANGUAGE DataKinds       #-}
{-# LANGUAGE KindSignatures  #-}
{-# LANGUAGE PatternSynonyms #-}

module Data.Result.Types
  ( Result
  , pattern Ok
  , pattern Err
  ) where

import           Data.Kind
import           Data.WorldPeace

-- | 'Result' is a synonym for 'Either (OpenUnion errs) a'
type Result (errs :: [Type]) = Either (OpenUnion errs)

pattern Ok :: val -> Either (OpenUnion err) val
pattern $bOk :: val -> Either (OpenUnion err) val
$mOk :: forall r val (err :: [*]).
Either (OpenUnion err) val -> (val -> r) -> (Void# -> r) -> r
Ok val = Right val

pattern Err :: OpenUnion errs -> Either (OpenUnion errs) b
pattern $bErr :: OpenUnion errs -> Either (OpenUnion errs) b
$mErr :: forall r (errs :: [*]) b.
Either (OpenUnion errs) b
-> (OpenUnion errs -> r) -> (Void# -> r) -> r
Err errs = Left errs