packages feed

kempe-0.2.0.7: src/Kempe/Error/Warning.hs

{-# LANGUAGE OverloadedStrings #-}

module Kempe.Error.Warning ( Warning (..)
                           ) where

import           Control.Exception (Exception)
import           Data.Semigroup    ((<>))
import           Data.Typeable     (Typeable)
import           Kempe.AST
import           Kempe.Name
import           Prettyprinter     (Pretty (pretty), squotes, (<+>))

data Warning a = NameClash a (Name a)
               | DoubleDip a (Atom a a) (Atom a a)
               | SwapBinary a (Atom a a) (Atom a a)
               | DoubleSwap a
               | DipAssoc a (Atom a a)
               | Identity a (Atom a a)
               | PushDrop a (Atom a a)

instance Pretty a => Pretty (Warning a) where
    pretty (NameClash l x)     = pretty l <> " '" <> pretty x <> "' is defined more than once."
    pretty (DoubleDip l a a')  = pretty l <+> pretty a <+> pretty a' <+> "could be written as a single dip()"
    pretty (SwapBinary l a a') = pretty l <+> squotes ("swap" <+> pretty a) <+> "is" <+> pretty a'
    pretty (DoubleSwap l)      = pretty l <+> "double swap"
    pretty (DipAssoc l a)      = pretty l <+> "dip(" <> pretty a <> ")" <+> pretty a <+> "is equivalent to" <+> pretty a <+> pretty a <+> "by associativity"
    pretty (Identity l a)      = pretty l <+> squotes ("dup" <+> pretty a) <+> "is identity"
    pretty (PushDrop l a)      = pretty l <+> squotes (pretty a <+> "drop") <+> "is identity"

instance (Pretty a) => Show (Warning a) where
    show = show . pretty

instance (Pretty a, Typeable a) => Exception (Warning a)