packages feed

overloaded 0.1.2 → 0.1.3

raw patch · 4 files changed

+58/−16 lines, 4 files

Files

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