refactor Ord to be based on compare
This commit is contained in:
2
TODO.md
2
TODO.md
@@ -9,7 +9,7 @@ More comments in code! This is getting big enough that I need to re-find my bear
|
|||||||
- [x] for parse error, seek to col 0 token and process next decl
|
- [x] for parse error, seek to col 0 token and process next decl
|
||||||
- [ ] record update sugar, syntax TBD
|
- [ ] record update sugar, syntax TBD
|
||||||
- I think I'm going to hold off on this for now as it requires the type to elaborate. This ends up at the head of an app, which typically is inferred. We'd need a special case somewhere that infers its argument instead.
|
- I think I'm going to hold off on this for now as it requires the type to elaborate. This ends up at the head of an app, which typically is inferred. We'd need a special case somewhere that infers its argument instead.
|
||||||
- [ ] Change `Ord` to be more like Idris - LT / EQ / GT (and entail equality)
|
- [x] Change `Ord` to be more like Idris - LT / EQ / GT (and entail equality)
|
||||||
- [ ] Keep a `compare` function on `SortedMap` (like lean)
|
- [ ] Keep a `compare` function on `SortedMap` (like lean)
|
||||||
- [x] keymap for monaco
|
- [x] keymap for monaco
|
||||||
- [x] SortedMap.newt issue in `where`
|
- [x] SortedMap.newt issue in `where`
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ instance Sub BigInt where a - b = subbi a b
|
|||||||
instance Cast Int BigInt where cast x = itobi x
|
instance Cast Int BigInt where cast x = itobi x
|
||||||
instance Eq BigInt where a == b = jsEq a b
|
instance Eq BigInt where a == b = jsEq a b
|
||||||
instance Show BigInt where show = jsShow
|
instance Show BigInt where show = jsShow
|
||||||
instance Ord BigInt where a < b = jsLT a b
|
instance Ord BigInt where compare a b = jsCompare a b
|
||||||
|
|
||||||
calcCost : BigInt → Machine → Maybe BigInt
|
calcCost : BigInt → Machine → Maybe BigInt
|
||||||
calcCost extra (MkMachine (ax, ay) (bx, by) (px, py)) =
|
calcCost extra (MkMachine (ax, ay) (bx, by) (px, py)) =
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ dirVal East = 2
|
|||||||
dirVal West = 3
|
dirVal West = 3
|
||||||
|
|
||||||
instance Ord Dir where
|
instance Ord Dir where
|
||||||
a < b = dirVal a < dirVal b
|
compare a b = compare (dirVal a) (dirVal b)
|
||||||
|
|
||||||
instance Eq Dir where
|
instance Eq Dir where
|
||||||
a == b = dirVal a == dirVal b
|
a == b = dirVal a == dirVal b
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ instance Sub BigInt where a - b = subbi a b
|
|||||||
instance Cast Int BigInt where cast x = itobi x
|
instance Cast Int BigInt where cast x = itobi x
|
||||||
instance Eq BigInt where a == b = jsEq a b
|
instance Eq BigInt where a == b = jsEq a b
|
||||||
instance Show BigInt where show = jsShow
|
instance Show BigInt where show = jsShow
|
||||||
instance Ord BigInt where a < b = jsLT a b
|
instance Ord BigInt where compare a b = jsCompare a b
|
||||||
|
|
||||||
data Machine : U where
|
data Machine : U where
|
||||||
M : BigInt → BigInt → BigInt → List Int → Int → SnocList Int → Machine
|
M : BigInt → BigInt → BigInt → List Int → Int → SnocList Int → Machine
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ instance Sub BigInt where a - b = subbi a b
|
|||||||
instance Cast Int BigInt where cast x = itobi x
|
instance Cast Int BigInt where cast x = itobi x
|
||||||
instance Eq BigInt where a == b = jsEq a b
|
instance Eq BigInt where a == b = jsEq a b
|
||||||
instance Show BigInt where show = jsShow
|
instance Show BigInt where show = jsShow
|
||||||
instance Ord BigInt where a < b = jsLT a b
|
instance Ord BigInt where compare a b = jsCompare a b
|
||||||
|
|
||||||
infixl 7 _%_
|
infixl 7 _%_
|
||||||
pfunc _%_ : BigInt → BigInt → BigInt := `(x,y) => x % y`
|
pfunc _%_ : BigInt → BigInt → BigInt := `(x,y) => x % y`
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ instance Sub BigInt where a - b = subbi a b
|
|||||||
instance Cast Int BigInt where cast x = itobi x
|
instance Cast Int BigInt where cast x = itobi x
|
||||||
instance Eq BigInt where a == b = jsEq a b
|
instance Eq BigInt where a == b = jsEq a b
|
||||||
instance Show BigInt where show = jsShow
|
instance Show BigInt where show = jsShow
|
||||||
instance Ord BigInt where a < b = jsLT a b
|
instance Ord BigInt where compare a b = jsCompare a b
|
||||||
|
|
||||||
-- base: 30s
|
-- base: 30s
|
||||||
-- switching from tuple to int: 8 s
|
-- switching from tuple to int: 8 s
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ instance Eq Op where
|
|||||||
_ == _ = False
|
_ == _ = False
|
||||||
|
|
||||||
record Gate where
|
record Gate where
|
||||||
constructor GT
|
constructor MkG
|
||||||
in1 : String
|
in1 : String
|
||||||
in2 : String
|
in2 : String
|
||||||
op : Op
|
op : Op
|
||||||
@@ -49,7 +49,7 @@ parseFile text = do
|
|||||||
parseGate s = do
|
parseGate s = do
|
||||||
let (in1 :: op :: in2 :: _ :: out :: Nil) = split s " " | _ => Left $ "bad gate: " ++ s
|
let (in1 :: op :: in2 :: _ :: out :: Nil) = split s " " | _ => Left $ "bad gate: " ++ s
|
||||||
op <- getOp op
|
op <- getOp op
|
||||||
Right $ GT in1 in2 op out
|
Right $ MkG in1 in2 op out
|
||||||
|
|
||||||
|
|
||||||
State : U
|
State : U
|
||||||
@@ -114,10 +114,10 @@ range : Int → Int → List Int
|
|||||||
range a b = if a < b then a :: range (a + 1) b else Nil
|
range a b = if a < b then a :: range (a + 1) b else Nil
|
||||||
|
|
||||||
swapPins : String → String → Gate → Gate
|
swapPins : String → String → Gate → Gate
|
||||||
swapPins a g (GT i1 i2 op out) =
|
swapPins a g (MkG i1 i2 op out) =
|
||||||
if out == a then GT i1 i2 op g
|
if out == a then MkG i1 i2 op g
|
||||||
else if out == g then GT i1 i2 op a
|
else if out == g then MkG i1 i2 op a
|
||||||
else GT i1 i2 op out
|
else MkG i1 i2 op out
|
||||||
|
|
||||||
fail : ∀ a. String -> a
|
fail : ∀ a. String -> a
|
||||||
fail msg = let x = trace "FAIL" msg in ?
|
fail msg = let x = trace "FAIL" msg in ?
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ instance Eq Dir where
|
|||||||
a == b = show a == show b
|
a == b = show a == show b
|
||||||
|
|
||||||
instance Ord Dir where
|
instance Ord Dir where
|
||||||
a < b = show a < show b
|
compare a b = compare (show a) (show b)
|
||||||
|
|
||||||
Done : U
|
Done : U
|
||||||
Done = SortedMap (Point × Dir) Unit
|
Done = SortedMap (Point × Dir) Unit
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ instance Concat String where
|
|||||||
|
|
||||||
pfunc jsEq uses (True False) : ∀ a. a → a → Bool := `(_, a, b) => a == b ? True : False`
|
pfunc jsEq uses (True False) : ∀ a. a → a → Bool := `(_, a, b) => a == b ? True : False`
|
||||||
pfunc jsLT uses (True False) : ∀ a. a → a → Bool := `(_, a, b) => a < b ? True : False`
|
pfunc jsLT uses (True False) : ∀ a. a → a → Bool := `(_, a, b) => a < b ? True : False`
|
||||||
|
|
||||||
pfunc jsShow : ∀ a . a → String := `(_,a) => ''+a`
|
pfunc jsShow : ∀ a . a → String := `(_,a) => ''+a`
|
||||||
instance Eq Int where
|
instance Eq Int where
|
||||||
a == b = jsEq a b
|
a == b = jsEq a b
|
||||||
@@ -662,39 +663,45 @@ tail : ∀ a. List a → List a
|
|||||||
tail Nil = Nil
|
tail Nil = Nil
|
||||||
tail (x :: xs) = xs
|
tail (x :: xs) = xs
|
||||||
|
|
||||||
--
|
data Ordering = LT | EQ | GT
|
||||||
|
instance Eq Ordering where
|
||||||
|
LT == LT = True
|
||||||
|
EQ == EQ = True
|
||||||
|
GT == GT = True
|
||||||
|
_ == _ = False
|
||||||
|
|
||||||
|
-- FIXME There is a subtle issue here with shadowing if the file defines a GT in its own namespace
|
||||||
|
-- We end up chosing that an assigning to GT, which cause a lot of trouble.
|
||||||
|
-- Prelude.GT is not in scope, because we've depended on the other one.
|
||||||
|
pfunc jsCompare uses (LT EQ GT) : ∀ a. a → a → Ordering := `(_, a, b) => a == b ? EQ : a < b ? LT : GT`
|
||||||
|
|
||||||
infixl 6 _<_ _<=_ _>_
|
infixl 6 _<_ _<=_ _>_
|
||||||
class Ord a where
|
class Ord a where
|
||||||
-- isEq : Eq a
|
compare : a → a → Ordering
|
||||||
_<_ : a → a → Bool
|
|
||||||
|
|
||||||
_<=_ : ∀ a. {{Eq a}} {{Ord a}} → a → a → Bool
|
_<_ : ∀ a. {{Ord a}} -> a → a → Bool
|
||||||
a <= b = a == b || a < b
|
a < b = compare a b == LT
|
||||||
|
|
||||||
|
_<=_ : ∀ a. {{Ord a}} → a → a → Bool
|
||||||
|
a <= b = compare a b /= GT
|
||||||
|
|
||||||
_>_ : ∀ a. {{Ord a}} → a → a → Bool
|
_>_ : ∀ a. {{Ord a}} → a → a → Bool
|
||||||
a > b = b < a
|
a > b = compare a b == GT
|
||||||
|
|
||||||
search : ∀ cl. {{cl}} -> cl
|
search : ∀ cl. {{cl}} -> cl
|
||||||
search {{x}} = x
|
search {{x}} = x
|
||||||
|
|
||||||
instance Ord Nat where
|
instance Ord Nat where
|
||||||
-- isEq = search
|
compare Z Z = EQ
|
||||||
_ < Z = False
|
compare _ Z = GT
|
||||||
Z < S _ = True
|
compare Z (S _) = LT
|
||||||
S n < S m = n < m
|
compare (S n) (S m) = compare n m
|
||||||
|
|
||||||
|
|
||||||
instance Ord Int where
|
instance Ord Int where
|
||||||
-- isEq = ?
|
compare a b = jsCompare a b
|
||||||
x < y = ltInt x y
|
|
||||||
|
|
||||||
instance Ord Char where
|
instance Ord Char where
|
||||||
x < y = jsLT x y
|
compare a b = jsCompare a b
|
||||||
|
|
||||||
-- foo : ∀ a. {{Ord a}} -> a -> Bool
|
|
||||||
-- foo a = a == a
|
|
||||||
|
|
||||||
|
|
||||||
flip : ∀ a b c. (a → b → c) → (b → a → c)
|
flip : ∀ a b c. (a → b → c) → (b → a → c)
|
||||||
flip f b a = f a b
|
flip f b a = f a b
|
||||||
@@ -724,7 +731,7 @@ ite : ∀ a. Bool → a → a → a
|
|||||||
ite c t e = if c then t else e
|
ite c t e = if c then t else e
|
||||||
|
|
||||||
instance Ord String where
|
instance Ord String where
|
||||||
a < b = jsLT a b
|
compare a b = jsCompare a b
|
||||||
|
|
||||||
instance Cast Int Nat where
|
instance Cast Int Nat where
|
||||||
cast n = intToNat n
|
cast n = intToNat n
|
||||||
@@ -738,8 +745,10 @@ swap (a,b) = (b,a)
|
|||||||
instance ∀ a b. {{Eq a}} {{Eq b}} → Eq (a × b) where
|
instance ∀ a b. {{Eq a}} {{Eq b}} → Eq (a × b) where
|
||||||
(a,b) == (c,d) = a == c && b == d
|
(a,b) == (c,d) = a == c && b == d
|
||||||
|
|
||||||
instance ∀ a b. {{Eq a}} {{Ord a}} {{Ord b}} → Ord (a × b) where
|
instance ∀ a b. {{Ord a}} {{Ord b}} → Ord (a × b) where
|
||||||
(a,b) < (c,d) = if a == c then b < d else a < c
|
compare (a,b) (c,d) = case compare a c of
|
||||||
|
EQ => compare b d
|
||||||
|
res => res
|
||||||
|
|
||||||
instance ∀ a. {{Eq a}} → Eq (List a) where
|
instance ∀ a. {{Eq a}} → Eq (List a) where
|
||||||
Nil == Nil = True
|
Nil == Nil = True
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
module Lib.Eval
|
module Lib.Eval
|
||||||
|
|
||||||
-- For FC
|
|
||||||
import Lib.Parser.Impl
|
|
||||||
import Lib.Prettier
|
|
||||||
import Lib.Types
|
import Lib.Types
|
||||||
import Lib.TopContext
|
import Lib.TopContext
|
||||||
|
|
||||||
@@ -13,10 +10,6 @@ import Data.SnocList
|
|||||||
import Data.Vect
|
import Data.Vect
|
||||||
import Data.SortedMap
|
import Data.SortedMap
|
||||||
|
|
||||||
-- Need to wire in the metas...
|
|
||||||
-- if it's top / ctx / IORef, I also need IO...
|
|
||||||
-- if I want errors, I need m anyway. I've already got an error down there.
|
|
||||||
|
|
||||||
export
|
export
|
||||||
eval : Env -> Mode -> Tm -> M Val
|
eval : Env -> Mode -> Tm -> M Val
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,11 @@
|
|||||||
module Lib.Parser
|
module Lib.Parser
|
||||||
import Lib.Types
|
|
||||||
import Debug.Trace
|
import Data.Maybe
|
||||||
import Data.String
|
import Data.String
|
||||||
|
|
||||||
-- app: foo {a} a b
|
|
||||||
-- lam: λ {A} {b : A} (c : Blah) d e f => something
|
|
||||||
-- lam: \ {A} {b : A} (c : Blah) d e f => something
|
|
||||||
-- pi: (A : Set) -> {b : A} -> (c : Foo b) -> c -> bar d
|
|
||||||
-- pi: (A B : Set) {b : A} -> (c : Foo b) -> c -> bar d
|
|
||||||
|
|
||||||
import Lib.Token
|
|
||||||
import Lib.Parser.Impl
|
import Lib.Parser.Impl
|
||||||
import Lib.Syntax
|
import Lib.Syntax
|
||||||
import Data.List
|
import Lib.Token
|
||||||
import Data.Maybe
|
import Lib.Types
|
||||||
|
|
||||||
ident = token Ident <|> token MixFix
|
ident = token Ident <|> token MixFix
|
||||||
|
|
||||||
@@ -104,10 +96,6 @@ pArg = do
|
|||||||
|
|
||||||
AppSpine = List (Icit,FC,Raw)
|
AppSpine = List (Icit,FC,Raw)
|
||||||
|
|
||||||
-- helper for debugging
|
|
||||||
traceM : Monad m => String -> m ()
|
|
||||||
traceM msg = trace msg $ pure ()
|
|
||||||
|
|
||||||
pratt : Operators -> Int -> String -> Raw -> AppSpine -> Parser (Raw, AppSpine)
|
pratt : Operators -> Int -> String -> Raw -> AppSpine -> Parser (Raw, AppSpine)
|
||||||
pratt ops prec stop left spine = do
|
pratt ops prec stop left spine = do
|
||||||
(left, spine) <- runPrefix stop left spine
|
(left, spine) <- runPrefix stop left spine
|
||||||
|
|||||||
Reference in New Issue
Block a user