{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE StrictData #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE TypeFamilies #-} --{-# LANGUAGE StandaloneDeriving #-} module NewInt where import qualified Data.IntSet as IS import qualified Data.IntMap.Strict as IM import Control.Lens import Data.Aeson import Data.Aeson.TH 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