{- |
Consider a cube of resistors of equal resistance.
What is the overall resistance from one corner to the opposite one?
-}
module ResistorCube where
import qualified Math.LinearCircuit as LinearCircuit
import qualified Data.Graph.Comfort as Graph
import Data.Graph.Comfort (Graph)
import Control.Applicative (liftA2, liftA3)
data Coord = C0 | C1 deriving (Eq, Ord, Show, Enum, Bounded)
data Corner = Corner Coord Coord Coord deriving (Eq, Ord, Show)
allCoords :: [Coord]
allCoords = [minBound .. maxBound]
dimEdges ::
(Coord -> Coord -> Coord -> Corner) ->
[(Graph.UndirEdge Corner, Double)]
dimEdges corner =
liftA2
(\a b -> (Graph.undirEdge (corner C0 a b) (corner C1 a b), 1))
allCoords allCoords
graph :: Graph Graph.UndirEdge Corner Double ()
graph =
Graph.fromList
(map (flip (,) ()) $ liftA3 Corner allCoords allCoords allCoords)
(dimEdges (\x y z -> Corner x y z) ++
dimEdges (\y z x -> Corner x y z) ++
dimEdges (\z x y -> Corner x y z))
resistance :: Double
resistance =
LinearCircuit.resistance graph
(Corner C0 C0 C0) (Corner C1 C1 C1)