

-- Ok, from what I understnad dependent types are kind of the type
-- equvileant to first-class functions.  Types can be stored,
-- returned, kinda like in zig. 

-- Btw unicode is cool, reminds me of raku
def α : Type := Nat
-- α is a variable that stores the type
#check α    -- > α : Type

-- BTW #check is like eval but works for types

-- This is a function that takes a type and returns a type
def F : Type → Type := List

#check F α

def IntOrString (isInt : Bool) : Type :=
  match isInt with
    | false => Int
    | true => String

#check IntOrString false

-- showOrReverse : (isInt : Bool) -> IntOrString isInt -> String
def negateOrIdentity (isString : Bool) (val : IntOrString isString)  : IntOrString isString :=
   match isString with
    | true => val
    | false => -val

#eval negateOrIdentity true "yo"
