packages feed

lean-0.0.0.1: Lean/Univ.hs

module Lean.Univ (Univ (Lean.Univ.Zero, Lean.Univ.Succ, Lean.Univ.Max, Lean.Univ.Imax, Lean.Univ.Param, Lean.Univ.Meta)) where

import Control.Arrow ((***))
import Foreign.Ptr
import System.IO.Unsafe
import Util

import Lean.IO.Util
import Lean.Exception ()
import Lean.Name (Name (Name))
import qualified Lean.Name as Name
import qualified Lean.Raw.C.Univ as Raw
import Lean.Wrapper.Univ

instance FromRaw Univ where
    type Raw Univ = Ptr Raw.Struct
    fromRaw = fmap Univ . fromRaw

instance Eq Univ where
    Univ a == Univ b = unsafePerformIO $ liftLean2 Raw.eq a b

instance Ord Univ where
    Univ a <= Univ b = (unsafePerformIO $ liftLean2 Raw.lt a b) || Univ a == Univ b

{-# COMPLETE Zero, Succ, Max, Imax, Param, Meta #-}

pattern Zero :: Univ
pattern Zero <- (Raw.kind . unwrap' . raw -> Raw.Zero) where
    Zero = Univ . unsafePerformIO $ liftLean0 Raw.mkZero

pattern Succ :: Univ -> Univ
pattern Succ u <- (fmap Univ . checked ((==) Raw.Succ . Raw.kind) (liftLean1 Raw.getPred) . raw -> Just u) where
    Succ = Univ . unsafePerformIO . liftLean1 Raw.mkSucc . raw

pattern Max :: Univ -> Univ -> Univ
pattern Max u v <- (fmap (Univ *** Univ) . checked ((==) Raw.Max . Raw.kind) (liftLean1 Raw.getMaxLhs &=& liftLean1 Raw.getMaxRhs) . raw -> Just (u, v)) where
    Max = curry $ Univ . unsafePerformIO . \ (Univ u, Univ v) -> liftLean2 Raw.mkMax u v

pattern Imax :: Univ -> Univ -> Univ
pattern Imax u v <- (fmap (Univ *** Univ) . checked ((==) Raw.Imax . Raw.kind) (liftLean1 Raw.getMaxLhs &=& liftLean1 Raw.getMaxRhs) . raw -> Just (u, v)) where
    Imax = curry $ Univ . unsafePerformIO . \ (Univ u, Univ v) -> liftLean2 Raw.mkImax u v

pattern Param :: Name -> Univ
pattern Param name <- (fmap Name . checked ((==) Raw.Param . Raw.kind) (liftLean1 Raw.getName) . raw -> Just name) where
    Param = Univ . unsafePerformIO . liftLean1 Raw.mkParam . Name.raw

pattern Meta :: Name -> Univ
pattern Meta name <- (fmap Name . checked ((==) Raw.Meta . Raw.kind) (liftLean1 Raw.getName) . raw -> Just name) where
    Meta = Univ . unsafePerformIO . liftLean1 Raw.mkMeta . Name.raw