Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE FlexibleContexts #-}
- {-# LANGUAGE GeneralizedNewtypeDeriving #-}
- {-# LANGUAGE NoMonomorphismRestriction #-}
- {-# LANGUAGE StandaloneDeriving #-}
- import Control.Lens
- import Data.Ratio
- newtype Bits = Bits Rational deriving (Show,Eq, Num, Fractional)
- newtype Bytes = Bytes Rational deriving (Show,Eq, Num, Fractional )
- newtype Kilo a = Kilo a deriving Show
- deriving instance Num a => Num (Kilo a)
- deriving instance Fractional a => Fractional (Kilo a)
- type Mega a = Kilo (Kilo a)
- type Giga a = Kilo (Mega a)
- bits :: Iso' Bytes Bits
- bits = iso (\(Bytes s) -> Bits $ 8 * s) (\(Bits s) -> Bytes $ s / 8)
- k :: (Fractional a, Num a) => Iso' (Kilo a) a
- k = iso (\(Kilo s) -> 1000 * s) (\s -> Kilo $ s / 1000)
- m = k . k
- g = k . m
- kb :: (Fractional a, Num a) => Iso' (Kilo a) a
- kb = iso (\(Kilo s) -> 1024 * s) (\s -> Kilo $ s / 1024)
- mb = kb . kb
- gb = kb . mb
Add Comment
Please, Sign In to add comment