overloaded 0.1.2 → 0.1.3
raw patch · 4 files changed
+58/−16 lines, 4 files
Files
- CHANGELOG.md +6/−0
- overloaded.cabal +2/−2
- src/Overloaded/Lists.hs +33/−6
- test/Overloaded/Test/Lists.hs +17/−8
CHANGELOG.md view
@@ -1,3 +1,9 @@+# 0.1.3++- Add `Nil` and `Cons` `Set` and `IntSet` instanes+- Add 'fromList' function for homogeneous things.+- Enable `PolyKinds` for `Lists` instances.+ # 0.1.2 - Add `Overloaded:RecordFields` type-checker plugin to emulate `HasField` from [`GHC.Record.Compat`](https://hackage.haskell.org/package/record-hasfield-1.0/docs/GHC-Records-Compat.html)
overloaded.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: overloaded-version: 0.1.2+version: 0.1.3 synopsis: Overloaded pragmas as a plugin description: Implement @Overloaded@ pragmas as a source plugin@@ -62,7 +62,7 @@ , split ^>=0.2.3.3 , syb ^>=0.7.1 , symbols ^>=0.3.0.0- , vec ^>=0.1.1.1+ , vec ^>=0.1.1.1 || ^>=0.2 test-suite example default-language: Haskell2010
src/Overloaded/Lists.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GADTs #-}-{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE PolyKinds #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}@@ -26,14 +26,17 @@ module Overloaded.Lists ( Nil (..), Cons (..),+ fromList, ) where -import Data.SOP.NP (NP (..), POP (..))+import Data.Coerce (coerce) import Data.List.NonEmpty (NonEmpty (..))-import Data.Coerce (coerce)+import Data.SOP.NP (NP (..), POP (..)) -import qualified Data.Vec.Lazy as Vec+import qualified Data.IntSet as IS+import qualified Data.Set as S import qualified Data.Type.Nat as N+import qualified Data.Vec.Lazy as Vec ------------------------------------------------------------------------------- -- Classes@@ -43,7 +46,7 @@ -- -- See test-suite for ways to define instances for 'Data.Map.Map'. -- There are at-least two-ways.--- +-- class Nil a where nil :: a @@ -51,6 +54,10 @@ class Cons x ys zs | zs -> x ys where cons :: x -> ys -> zs +-- | @since 0.1.2+fromList :: (Nil xs, Cons x xs xs) => [x] -> xs+fromList = foldr cons nil+ ------------------------------------------------------------------------------- -- base -------------------------------------------------------------------------------@@ -65,6 +72,26 @@ cons = (:|) -------------------------------------------------------------------------------+-- containers+-------------------------------------------------------------------------------++-- | @since 0.1.2+instance Nil (S.Set a) where+ nil = S.empty++-- | @since 0.1.2+instance Ord a => Cons a (S.Set a) (S.Set a) where+ cons = S.insert++-- | @since 0.1.2+instance Nil IS.IntSet where+ nil = IS.empty++-- | @since 0.1.2+instance Cons Int IS.IntSet IS.IntSet where+ cons = IS.insert++------------------------------------------------------------------------------- -- vec ------------------------------------------------------------------------------- @@ -88,4 +115,4 @@ nil = POP Nil instance Cons (NP f xs) (POP f xss) (POP f (xs ': xss)) where- cons = coerce ((:*) :: NP f xs -> NP (NP f) xss -> NP (NP f) (xs ': xss))+ cons = coerce (cons :: NP f xs -> NP (NP f) xss -> NP (NP f) (xs ': xss))
test/Overloaded/Test/Lists.hs view
@@ -12,6 +12,7 @@ import Test.Tasty.HUnit (testCase, (@?=)) import qualified Data.Map as Map+import qualified Data.Set as Set import qualified Data.Type.Nat as N import Overloaded.Lists@@ -50,23 +51,31 @@ pop @?= POP ((I 0 :* I False :* Nil) :* (I "NO" :* Nil) :* Nil) , testCase "Map inline" $ do- let m :: M Int Char- m = [1, 'x', 3, 'y', 2, 'z']+ let m :: Map.Map Int Char+ m = unM [1, 'x', 3, 'y', 2, 'z'] - m @?= M (Map.fromList [(1,'x'),(2,'z'),(3,'y')])+ m @?= Map.fromList [(1,'x'),(2,'z'),(3,'y')] , testCase "Map pairs" $ do- let m :: N Int Char- m = [(1, 'x'), (3, 'y'), (2, 'z')]+ let m :: Map.Map Int Char+ m = unN [(1, 'x'), (3, 'y'), (2, 'z')] - m @?= N (Map.fromList [(1,'x'),(2,'z'),(3,'y')])+ m @?= Map.fromList [(1,'x'),(2,'z'),(3,'y')]++ , testCase "Set" $ do+ let s :: Set.Set Char+ s = ['f', 'o', 'o']++ s @?= Set.fromList ['o', 'f']++ s @?= fromList ['o', 'f'] ] ------------------------------------------------------------------------------- -- Map inline ------------------------------------------------------------------------------- -newtype M k v = M (Map.Map k v)+newtype M k v = M { unM :: Map.Map k v } deriving (Eq, Show) newtype M' k v = M' (k -> Map.Map k v)@@ -84,7 +93,7 @@ -- Map pairs ------------------------------------------------------------------------------- -newtype N k v = N (Map.Map k v)+newtype N k v = N { unN :: Map.Map k v } deriving (Eq, Show) instance Nil (N k v) where