packages feed

lean-0.0.0.1: Lean/Name.hs

module Lean.Name where

import Data.Function (on)
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Foreign as Text
import Foreign.Ptr
import System.IO.Unsafe
import Util

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

newtype Name = Name { raw :: Wrapper Raw.Struct }

instance Show Name where
    show (Name name) = Text.unpack . unsafePerformIO $ liftLean1 Raw.toString name

instance Eq Name where
    Name a == Name b = (/= 0) . unsafePerformIO $ (Raw.eq `on` unwrap') a b

instance Ord Name where
    Name a <= Name b = ((/= 0) . unsafePerformIO $ (Raw.lt `on` unwrap') a b) || Name a == Name b

{-# COMPLETE Anonymous, Str, Idx #-}

pattern Anonymous :: Name
pattern Anonymous <- ((/= 0) . unsafePerformIO . Raw.isAnonymous . unwrap' . raw -> True) where
    Anonymous = Name . unsafePerformIO $ liftLean0 Raw.mkAnonymous

pattern Str :: Name -> Text -> Name
pattern Str name xs <- (checked ((/= 0) . unsafePerformIO . Raw.isStr) (fmap Name . liftLean1 Raw.getPrefix &=& liftLean1 Raw.getStr) . raw -> Just (name, xs)) where
    Str (Name name) = Name . unsafePerformIO . flip Text.useAsPtr (pure . flip (liftLean1 . flip Raw.mkStr) name . castPtr) . flip Text.snoc '\0'

pattern Idx :: Name -> Word -> Name
pattern Idx name k <- (checked ((/= 0) . unsafePerformIO . Raw.isIdx) (fmap Name . liftLean1 Raw.getPrefix &=& liftLean1 Raw.getIdx) . raw -> Just (name, k)) where
    Idx (Name name) = Name . unsafePerformIO . flip (liftLean1 . flip Raw.mkIdx) name . fromIntegral