@@ -121,13 +121,27 @@ deriveInstance mn syns _ ds (TypeInstanceDeclaration sa@(ss, _) ch idx nm deps c
121121 -> TypeInstanceDeclaration sa ch idx nm deps className tys . ExplicitInstance <$> deriveEq ss mn syns ds tyCon
122122 | otherwise -> throwError . errorMessage' ss $ ExpectedTypeConstructor className tys ty
123123 _ -> throwError . errorMessage' ss $ InvalidDerivedInstance className tys 1
124+ | className == Qualified (Just dataEq) (ProperName " Eq1" )
125+ = case tys of
126+ [ty] | Just (Qualified mn' _, _) <- unwrapTypeConstructor ty
127+ , mn == fromMaybe mn mn'
128+ -> pure . TypeInstanceDeclaration sa ch idx nm deps className tys . ExplicitInstance $ deriveEq1 ss
129+ | otherwise -> throwError . errorMessage' ss $ ExpectedTypeConstructor className tys ty
130+ _ -> throwError . errorMessage' ss $ InvalidDerivedInstance className tys 1
124131 | className == Qualified (Just dataOrd) (ProperName " Ord" )
125132 = case tys of
126133 [ty] | Just (Qualified mn' tyCon, _) <- unwrapTypeConstructor ty
127134 , mn == fromMaybe mn mn'
128135 -> TypeInstanceDeclaration sa ch idx nm deps className tys . ExplicitInstance <$> deriveOrd ss mn syns ds tyCon
129136 | otherwise -> throwError . errorMessage' ss $ ExpectedTypeConstructor className tys ty
130137 _ -> throwError . errorMessage' ss $ InvalidDerivedInstance className tys 1
138+ | className == Qualified (Just dataOrd) (ProperName " Ord1" )
139+ = case tys of
140+ [ty] | Just (Qualified mn' _, _) <- unwrapTypeConstructor ty
141+ , mn == fromMaybe mn mn'
142+ -> pure . TypeInstanceDeclaration sa ch idx nm deps className tys . ExplicitInstance $ deriveOrd1 ss
143+ | otherwise -> throwError . errorMessage' ss $ ExpectedTypeConstructor className tys ty
144+ _ -> throwError . errorMessage' ss $ InvalidDerivedInstance className tys 1
131145 | className == Qualified (Just dataFunctor) (ProperName " Functor" )
132146 = case tys of
133147 [ty] | Just (Qualified mn' tyCon, _) <- unwrapTypeConstructor ty
@@ -436,6 +450,9 @@ deriveEq ss mn syns ds tyConNm = do
436450 preludeEq :: Expr -> Expr -> Expr
437451 preludeEq = App . App (Var (Qualified (Just dataEq) (Ident C. eq)))
438452
453+ preludeEq1 :: Expr -> Expr -> Expr
454+ preludeEq1 = App . App (Var (Qualified (Just dataEq) (Ident C. eq1)))
455+
439456 addCatch :: [CaseAlternative ] -> [CaseAlternative ]
440457 addCatch xs
441458 | length xs /= 1 = xs ++ [catchAll]
@@ -458,12 +475,21 @@ deriveEq ss mn syns ds tyConNm = do
458475 conjAll xs = foldl1 preludeConj xs
459476
460477 toEqTest :: Expr -> Expr -> Type -> Expr
461- toEqTest l r ty | Just rec <- objectType ty
462- , Just fields <- decomposeRec rec =
463- conjAll
464- . map (\ ((Label str), typ) -> toEqTest (Accessor str l) (Accessor str r) typ)
465- $ fields
466- toEqTest l r _ = preludeEq l r
478+ toEqTest l r ty
479+ | Just rec <- objectType ty
480+ , Just fields <- decomposeRec rec =
481+ conjAll
482+ . map (\ ((Label str), typ) -> toEqTest (Accessor str l) (Accessor str r) typ)
483+ $ fields
484+ | isAppliedVar ty = preludeEq1 l r
485+ | otherwise = preludeEq l r
486+
487+ deriveEq1 :: SourceSpan -> [Declaration ]
488+ deriveEq1 ss =
489+ [ ValueDecl (ss, [] ) (Ident C. eq1) Public [] (unguarded preludeEq)]
490+ where
491+ preludeEq :: Expr
492+ preludeEq = Var (Qualified (Just dataEq) (Ident C. eq))
467493
468494deriveOrd
469495 :: forall m
@@ -510,6 +536,9 @@ deriveOrd ss mn syns ds tyConNm = do
510536 ordCompare :: Expr -> Expr -> Expr
511537 ordCompare = App . App (Var (Qualified (Just dataOrd) (Ident C. compare )))
512538
539+ ordCompare1 :: Expr -> Expr -> Expr
540+ ordCompare1 = App . App (Var (Qualified (Just dataOrd) (Ident C. compare1)))
541+
513542 mkCtorClauses :: ((ProperName 'ConstructorName, [Type ]), Bool ) -> m [CaseAlternative ]
514543 mkCtorClauses ((ctorName, tys), isLast) = do
515544 identsL <- replicateM (length tys) (freshIdent " l" )
@@ -547,12 +576,21 @@ deriveOrd ss mn syns ds tyConNm = do
547576 ]
548577
549578 toOrdering :: Expr -> Expr -> Type -> Expr
550- toOrdering l r ty | Just rec <- objectType ty
551- , Just fields <- decomposeRec rec =
552- appendAll
553- . map (\ ((Label str), typ) -> toOrdering (Accessor str l) (Accessor str r) typ)
554- $ fields
555- toOrdering l r _ = ordCompare l r
579+ toOrdering l r ty
580+ | Just rec <- objectType ty
581+ , Just fields <- decomposeRec rec =
582+ appendAll
583+ . map (\ ((Label str), typ) -> toOrdering (Accessor str l) (Accessor str r) typ)
584+ $ fields
585+ | isAppliedVar ty = ordCompare1 l r
586+ | otherwise = ordCompare l r
587+
588+ deriveOrd1 :: SourceSpan -> [Declaration ]
589+ deriveOrd1 ss =
590+ [ ValueDecl (ss, [] ) (Ident C. compare1) Public [] (unguarded dataOrdCompare)]
591+ where
592+ dataOrdCompare :: Expr
593+ dataOrdCompare = Var (Qualified (Just dataOrd) (Ident C. compare ))
556594
557595deriveNewtype
558596 :: forall m
@@ -617,6 +655,10 @@ mkVarMn mn = Var . Qualified mn
617655mkVar :: Ident -> Expr
618656mkVar = mkVarMn Nothing
619657
658+ isAppliedVar :: Type -> Bool
659+ isAppliedVar (TypeApp (TypeVar _) _) = True
660+ isAppliedVar _ = False
661+
620662objectType :: Type -> Maybe Type
621663objectType (TypeApp (TypeConstructor (Qualified (Just (ModuleName [ProperName " Prim" ])) (ProperName " Record" ))) rec ) = Just rec
622664objectType _ = Nothing
0 commit comments