{-# 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