40 lines
1.1 KiB
Haskell
40 lines
1.1 KiB
Haskell
{-# LANGUAGE DerivingStrategies #-}
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
{-# LANGUAGE StrictData #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
|
|
--{-# LANGUAGE StandaloneDeriving #-}
|
|
module NewInt where
|
|
|
|
import Control.Lens
|
|
import Data.Aeson
|
|
import Data.Aeson.TH
|
|
import qualified Data.IntMap.Strict as IM
|
|
import qualified Data.IntSet as IS
|
|
|
|
newtype NewInt a = NInt {_unNInt :: Int}
|
|
deriving newtype (Eq, Ord, Show, Num, Read, Integral, Real, Enum)
|
|
|
|
newtype NewIntSet a = NIntSet {_unNIntSet :: IS.IntSet}
|
|
deriving newtype (Eq, Ord, Show, Read)
|
|
|
|
newtype NewIntMap a b = NIntMap {_unNIntMap :: IM.IntMap b}
|
|
deriving newtype (Foldable, Functor, Monoid, Semigroup)
|
|
deriving (Eq, Ord, Show, Read)
|
|
|
|
type instance Index (NewIntMap a b) = NewInt a
|
|
|
|
type instance IxValue (NewIntMap a b) = b
|
|
|
|
instance Ixed (NewIntMap a b) where
|
|
ix (NInt i) f (NIntMap m) = fmap NIntMap (ix i f m)
|
|
|
|
instance At (NewIntMap a b) where
|
|
at (NInt i) f (NIntMap m) = fmap NIntMap (at i f m)
|
|
|
|
makeLenses ''NewInt
|
|
makeLenses ''NewIntMap
|
|
deriveJSON defaultOptions ''NewInt
|
|
deriveJSON defaultOptions ''NewIntMap
|